読者です 読者をやめる 読者になる 読者になる

稲沢市よりお届けしてます。

Perlをはじめとしたプログラミング周りのあれこれについて。Perl界のモブキャラとして暗躍します(謎)。

PHPだと文字化けしないのに、なんでPerlでは文字化けするの?弱いの?

数週間前、会社の同僚から
PHPではこんな文字化け起きないのに、なんでPerlでは起きるんだろうか?」

という話をもらった。

「言語仕様なんじゃないかな?」

と、それっぽいことを答えて、お茶を濁したのですが
やっぱり気になったので、自分なりに調べてみた。


※それなりに調べて、自分なりに解釈したものの誤っている部分もあるかと思うので(特にPHPに関して)お気づきの点があれば、ご指摘ください。

※また、回りくどい考察や思考の過程をすっ飛ばして結論を読みたい方は、一番下の「■乱暴な結論 」をご覧あれ。

Perlでのマルチバイト文字列の扱い

◎気をつけたい前提条件
(1)Perlは内部処理を行う際に全ての入力をPerl内部用UTF-8内部文字列に変換して処理する
(2)encodingしなければ、Perlは入って来るマルチバイト文字列をシングルバイト文字列として処理する
(3)WindowsコマンドプロンプトではShift_JISを拡張したcp932でしか表示できない(Windowsユーザ向け)
コマンドプロンプトでUTF-8を表示しようという試みがありましたが、やはり難しいようです


Perlスクリプトで外部ファイルを読み込み、何かしらの形で出力する場合

 ______         ________________         ______
|      |       |                |       |      |
| 入力 |======>|  perl の処理   |======>| 出力 | 
|______|       |________________|       |______| 
           入力をdecode      出力前にencode

この場合、
・入力するファイルの文字コードPerl内部用UTF-8内部文字列に変換
・処理が終わったPerl内部用UTF-8内部文字列を出力に合わせて文字コード変換

といったことを明示的に行わなければいけません。

PHPでのマルチバイト文字列の扱い

◎前提条件
(1)基本的にはphp.iniファイルの設定で制御する
(2)文字コードの自動変換機能がある
(3)共用レンタルサーバーでは、サーバー運営側が既に設定してくれている(ユーザはいじれない)

PHP文字化け」でググって出てきた下記の2サイトを参考にさせていただきました。

http://p.tl/gB0W

http://p.tl/E_Xi

乱暴な結論

調べていくうちに「なんだそういう事かよ」と思ってしまったのですが、

要するに、

Perlを使うのならば、マルチバイト系の文字列の扱いについてプログラマがしっかり面倒をみてやる必要がある』

一方、

『国内の共用レンタルサーバを利用するのであれば、php.iniはデフォルトで日本語環境に最適化されており
PHPでマルチバイト系の文字化けについて考えなくちゃあいけない局面にぶつかる可能性はかなり低い』

といった所でしょうか。



1990年代後半から2000年代初頭に破竹の勢いで広がったPerl/CGI

その代替・発展技術としてノンプログラマにも広まったPHP

その隆盛の理由の一端を垣間見たような気がしました。