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サイトを参考にさせていただきました。