PHPにおける文字列のエンコーディングについて質問があります。ご存知の方がいらっしゃいましたらご教示を願います。
質問の主旨
文字列のエンコーディングがUTF-8であるにも関わらず、Webブラウザで表示されたときに文字化けするのはなぜでしょうか?
GitHub上にUPしているコードを実行すると、上記の画像のように文字列エンコーディングがUTF-8を返しているにも関わらず、続いて表示されている文字が文字化けしています。
28行目でPHPの組み込み関数である、mb_convert_encodingを使ってASCII値からUTF-8に変換し、mb_detect_encodingで文字列のエンコーディングがUTF-8であることを確認しているにも関わらず、このような表示がされることに納得ができません。
質問の補足
補足1.
今回の質問はいまどきのアルゴリズムを使いこなす PHPプログラミング開発テクニック という本のP121「最強のアルゴリズム-ワンタイムパッド」に基づいて行なっています。そのコードをコピぺしたものをGitHubにアップしています。
補足2.
ただしそのコピぺしたコードをWebブラウザで確認するとこの画像のように同じく文字化けをおこします。
補足3.
エディタはAtomを使用しています。文字エンコーディングはUTF-8にしています。
補足4.
ローカル開発環境としてWockerを使用しています。(自分が確認した限り)Wockerには、/etcの直下にはphp.iniが存在しません。従ってmbstring.internal_encodingの設定がUTF-8になっているかどうかは明らかではありません。
補足5.
ただし、1のコードをそのままCloud9で実行しても同じく文字化けが発生します。またvagrantを使用したローカル開発環境上で実行させてもやはり文字化けが発生します。
以上、よろしくお願い申し上げます。
質問の回答
2017年8月16日(水)に行われたさくらクラブの「いろいろ初心者もくもく会」において、この質問について上級者の方からアドバイスをいただくことができました。
そのアドバイスによると、文字列を暗号化することはその文字すらも分からなくしてしまうこともあるそうです。従って、補足2のように暗号化した文字列が文字化けで表示されることは、何も問題ないそうです。復号化されたときの文字列が、平文に戻っていたらそれでOKとのこと。
アドバイスありがとうございました!
【参考サイト】
- PHP: ord – Manual
- PHP: chr – Manual
- PHP: mb_convert_encoding – Manual
- PHP: mb_detect_encoding – Manual
- PHP: サポートされる文字エンコーディング – Manual