スマートフォン用の表示で見る隠居日録2016年(世にいう平成28年)、発作的に会社を辞め、隠居生活に入る。perlperlで日本語の文字化けが起きてしまい、はまってしまった。考えてみたら、前に一度同じ理由ではまったことがあり(その時はSQLiteに書き込む際の値が文字化けした)、自戒を込めて記録しておく。perlに関する説明で、「日本語を処理するときは、(内部コードになっていない場合は)decodeで内部コードに変換し、最終的なところでencodeで所望の漢字コードに変換すると文字化けが起きない」というようなことが書かれている。たしかに、この説明は正しい。見た目においては、この方法で問題はほぼ発生しないと思う。ところが、以下のようなperlスクリプトを実行すると、$tagの値は「title」であり、$titleの値は「日本語文字列」なのだが、それらをechoコマンドで表示させると、文字化けする。titleはundefだ。utf8のフラグが付いているスカラー$vから変換した$tagにも中身はアルファベットであるにもかかわらずutf8フラグが付いているのだ。$titleはencodeしたので、utf8フラグはついていない。この二つを結合した$cmdはどうなるかというと、utf8フラグが付いてしまうのだ。この問題の凶悪なところは$cmdの内容をperlスクリプト内でprintを用いて出力しても、見た目は正しく見えるのでだが、systemに渡すと、その時点で文字化けが発生してしまうことだ。文字化けを避けるためには、$tagを結合する前に、やはりencodeしてutf8フラグを消さなければならないということだ。好きなコードでよいだろうが、アルファベットであることが確実ならば、asciiにでもしておけばよい。(1)月別アーカイブお知らせ当サイトはプライバシーポリシーを参照の上ご利用ください。はてなブログをはじめよう!prozorecさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。