PHP+UTF-8で特定の文字(芳・能など)の文字化け回避方法

過去のトラブルシューティングでも「PHP+MySQLで日本語文字化けへの対処」「PHP+MySQL+UTF-8で文字化け回避」のエントリでPHP関連の文字化けを取り扱っておりましたが、また新たな事例に直面してしまいましたので、新たな解決法を残しておこうと思います。

ここ1、2年の間に納品したサイトはほぼXHTML+CSS+UTF-8という仕様で、フォームの受け取りプログラムなどはPHPで記述するというのが通例になっています。
ほとんどの場合弊社で提供したサーバーですので、設定やクセについては研究済みで対処は簡単でしたが、今回クライアントが独自に契約した社外サーバだった事もあって未知のトラブルにみまわれました。

フォームで受け取った内容をメールで送信するPHPを組み込み、テスト段階ではうまく稼動していたのですが、最終段階で"お名前"の欄に私の名前「芳賀」を入力して送信したところ...文字化けが発生しました!
他の「佐藤」とか「鈴木」とか「リア・ディゾン」とか「アサヒる」とかは問題ないのにナゼ?!

社内では呪われた名前だと黒いウワサにまで...

特定の文字が文字化けする事例

実は特定の文字が文字化けする事例は昔からよくありまして、CGIなんかで文字を表示する時に「表・予・申・能・十・ソ」といった特定の文字列が文字化けしてしまうものでした。 文字化けの仕組みそのものについては、"ウェブマスターのための文字化け講座"さんで詳しく解説されていますのでそちらを参考にしてください。 これらの文字化けに対処するにはエスケープ文字の「\」を、文字化けする対象の文字の前に挟んであげれば大概は解決いたしますw

今回はUTF-8で作成したXHTMLのフォームからの受け取りで、初期段階から受け取った内容が「?????」と文字化けしてしまう現象にみまわれました。
しかしこの現象は既知のもので、「PHP+MySQL+UTF-8で文字化け回避」で書いた通りPHPの内部処理の文字コードがEUCをベースにしている事が原因であるというのは分かってました。そこで下記のように「mb_convert_encoding()を使ってムリムリ文字コード変換をかませる」ように組んでUTF-8に変換する事で対処しました。

$var = mb_convert_encoding($var,"UTF-8","auto");

これで「佐藤」とか「鈴木」といった通常の文字列はキチンと受け取れる事は確認できました。しかし前述の通り、私の名前の「芳賀」というのを入力した場合のみ文字化けが発生してしまいます。
何度かテストして確認したところ、「芳」とか「能」といった文字が最初の1文字目にある場合のみ文字化けが発生している事が分かりました。

実際の回避方法はすごく単純だった...

過去事例の回避方法を試したり、ググりまくって解決方法を探ったのですが、決定的なものが見つからないまま数時間潰してしまいました...。 いたずらに時間が過ぎる中、憔悴しきった頭でふと「PHP+MySQLで日本語文字化けへの対処」を読み直すと、コーディングの仕方が若干違う事に気がつきました!!

mb_convert_encoding()で指定する変換前の文字コードの指定をメンドクサがって"auto"にしていましたが、PHPの内部処理がEUCだというのは分かりきっているのだから、この際ギチギチに"EUC-JP"に指定すべきだったんです!!

という事で下記のように修正

$var = mb_convert_encoding($var,"UTF-8","EUC-JP");
... ... ... ... ...

ヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノ ウゴイター


なんだ結構単純なところでミスってるもんなんだな...

トラックバック(0)

トラックバックURL: http://www.infinity-dimensions.com/mt/mt-tb.cgi/451

コメントする

現在のページ

HOME » ID-Blogger » テクノロジー » トラブルシューティング » PHP+UTF-8で特定の文字(芳・能など)の文字化け回避方法