【php】髙(いわゆる「はしご高」)が文字化けする!
問題
EUC-JPの文字をUTF-8に変換したんだけど、髙(はしご高)が化けてるの。
何で?
答え
php、MySQLにはさまざまな文字コード変換の機能が備わっていますが、期待した動作をするとは限らないようです。
一部の文字の変換のマッピングが定義されていないのかいろんな場合にいろんな文字化けが発生します。
あまり当てにならないのは MySQLの自動文字コード変換で、ujisで作ったデータベースにクライアント側がutf8でデータを欲しいと言うと、機種依存文字等が化けて返ってきます。
phpの方がよくがんばっていますが、それでもたまに文字化けに出会います。
そして、悪あがき的な対応を試みていると、偶然化けないルートが見つかったりします。
例)
<あるphp5の環境で>
//元の文字列はEUC-JPだとします。
var_dump(
mb_convert_encoding('髙(はしごだか)', 'UTF-8', 'eucjp'),
mb_convert_encoding('髙(はしごだか)', 'UTF-8', 'eucjp-win'),
mb_convert_encoding(mb_convert_encoding('髙(はしごだか)', 'sjis-win', 'eucjp'), 'UTF-8', 'sjis-win')
);
<結果>
string(22) "?(はしごだか)"
string(24) "(はしごだか)"
string(24) "髙(はしごだか)"
すべてUTF-8なら問題ないんですけどね。
MySQLとphpがかかわっている文字化けは、なるべくMySQLに自動変換させないようにデータを取得して、phpでもがいてみるというのがいいと思います。