文字コード表
携帯画面サイズに詰め込める限り詰め込んでみた。
Latin-1
白い文字はLatin-1。
「ISO 8859-1」別名「Latin-1」は欧米でよく使われている1バイトの文字コードで、ASCIIで使われていなかった0x80~0xFFまでのコードに文字を入れたものである。
ASCII文字は全てそのままの形で残っている。
正式なLatin-1では80台と90台は制御文字に使われているのだが、ここにも文字を詰め込んだものが「Windows-1252」として知られる。ここに示すのは正確にはこちらだが、Webブラウザで「Latin-1」を選んでもWindows-1252の文字が出るのであまり正確な使い分けはされていない気がする。
Shift_JIS
赤い文字はShift_JISの1バイト目、青い文字は2バイト目。
日本人にはおなじみのShift_JIS。このコードは実は非常に複雑な構造をしています。
まず、Shift_JISの(というか、JISの)文字は94の「区」、94の「点」で表される区点コードというもので定義されます。
区点コード表はこちら。
携帯でも大抵区点コードから入力できますし、PC上では区点コードの頭に0をつけたものをF5で漢字変換できます。
例えば「雷」という字の区点コードは「4575」です。
お手持ちの携帯で文字入力モードを「コード」や「区点」というところに切り替えて、「4575」を入れてみてください。
PCなら漢字入力モードで「04575」と入れてF5を押します。
さてここで上の表を見ていただきたい。
94×94の升目が必要なのだが1バイト目の赤い数字は94の半分、47しかない。
そして2バイト目の青い数字は94の倍、188だけある。
これはつまり、1バイト目で区の2つごとの番号を選び、2バイト目で区の偶数/奇数と点を選ぶのだ。
その上で、この表の見方だが、まず青い数字に何もついていないのが区が奇数、「+」がつけてあるのが区が偶数のコードに相当する。
そして「+」がついているときは1バイト目の赤い数字に1を足したものが区の番号である。
「雷」の例でいくと、
区は45区なので、まず45という赤数字を探す。これは0x97の位置にある。
次に、点は75、そして区は奇数だったので、青数字で「+」のついていない75を探す。これは0x8Bにある。
つまり「雷」をShift_JISコードで表すと 97 8B というデータになるという事が分かる。
応用
Shift_JIS⇔Latin-1の間では文字化けが多発する。ネット上の文字化けの半分はこの2つの取り違えから起こる。他によくあるのはEUC-JP⇔Shift_JISだ。
さてそこでこの表を使えばShift_JIS⇔Latin-1間の文字化けを復元することが出来るのだ。
「雷」の例で言えば、表で「97」「8B」にあたるLatin-1側の文字を見ると「—」「‹」であることが分かる。
つまり「雷」と書かれた文字が誤ってLatin-1で読まれると「—‹」と見えるのだ。
逆の例をあげてみよう。「Pokémon」という文字列があったとする。
この場合「é」はLatin-1で0xE9の場所にあり、Shift_JISで読むと「81/82区」を表す1バイト目と認識される。
よって次の「m」=0x6Dは2バイト目と判断され、奇数区の46点を表す。
あわせて区点番号8146、この字は何かというと「駑」という文字だ。「麒麟も老いては駑馬に劣る」の「駑」である。
だから、外国のサイトを見ていて「Pok駑on」という文字列を見かけたら、ああ、これはPokémonの事なんだなと理解しよう。
なお、Shift_JIS→Latin-1の場合は2バイト文字がことごとく文字化けするのですぐに分かるのだが、Latin-1→Shift_JISの文字化けでは、ほとんどの文字はShift_JISでも正常に表示できるASCII領域の文字なのでなかなか気づきにくかったりする。