gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

文字コードの判定

発生したのはPHPなのですが、本質的には他の言語でも発生しうるなぁ、っと思ったので。


事象としては「特定の文字を入力すると文字化けする」で、調査を開始しました。


入力文字は「渡辺」。これを入れると、確認画面で「羝∴昇」と出てきます………はて?
確認をしていくと、以下がわかりました。
・入力時には、文字コードを「推測」して(mb_detect_encoding)、それをUTF8に変換する


で…このmb_detect_encodingの引数に問題がありまして。
いや、普段だと大して問題にもならんのでしょうが。部分的に切り抜くと「EUC-win,UTF-8」とあったわけですね。
UTF-8よりもEUCが優先順位高め。


次に、渡辺という文字を「UTF-8にしたとき」のバイナリデータを確認してみました。
こーゆー時に、雑なルーチン( https://github.com/gallu/MagicWeapon/blob/master/debug_util.inc )一個手持ちにあると楽ができますw


で…確認。
( (e6)(b8)(a1)(e8)(be)(ba) )


………あぁ orz
んと…渡( (e6)(b8)(a1) ) 辺( (e8)(be)(ba) )なのですが。
これを
(e6)(b8)
(a1)(e8)
(be)(ba)
ってやると、なんの問題もなく「EUCマッピング上」に乗っかるですだす。


確かにこれだと「EUCかUTF8か不明」で、その上で「EUCのほうが優先順位高い」んなら、文字も化けましょう。


こゆときどうしましょうかねぇ? ってのも色々あるのですが。
まずは「興味深い」事象だったので、メモ兼ねて。