Shift_JIS と UTF-8 の違い
文字化けの原因をひとことにすると この二つを取り違えたことです。文字コードをご存じなくても読めるように書きました。
コンピュータは文字ではなく数字を保存する
コンピュータの中に文字はありません。数字だけです。ですから あ という文字を保存するとき、「あ=何番」という対応表を見てその番号を書き込みます。読むときは同じ表で番号を文字に戻します。
問題は その表がひとつではないことです。保存に使った表と読むときの表が違えば、同じ番号が別の文字になります。文字化けとはそれだけのことです。情報が消えたのではなく、番号を違う本で引いただけです。
Shift_JIS・EUC-JP — 日本で使われてきた表
Web が広まる前は、地域ごとに自前の表を作っていました。日本では Shift_JIS(Windows の拡張版は CP932)と EUC-JP、韓国では EUC-KR、中国では GBK、西欧では Latin-1 や CP1252 です。
どの表もその地域の文字しか持っていません。英数字は1バイト、漢字やかなは2バイトで、ファイルが小さく済むという利点がありました。保存容量が高価だった時代には重要なことでした。
代わりに 日本語とロシア語を同じ文書に混ぜられません。表に相手の文字の番号がそもそも無いからです。さらに厄介なのは、ファイルの中に「どの表で書いたか」を記す欄が無いことです。プログラムは推測するしかなく、しばしば外します。
UTF-8 — 世界共通の表
「地域ごとに表が違うのが問題なら、ひとつにまとめよう」として生まれたのが Unicode で、それをファイルに書く方式のうち最も広く使われているのが UTF-8 です。今の Web の98%以上が UTF-8 です。
ラテン文字・ギリシャ文字・キリル文字・アラビア文字・ハングル・かな・漢字・絵文字がすべて入っています。ひとつの文書に混ぜても構いません。英数字は1バイトで従来と同じ番号のまま、漢字やかなは 3バイトになるので Shift_JIS よりファイルは少し大きくなります。今は保存容量が安いので気にする話ではありません。
だから日本語はよく化ける
英語圏の人はこの問題にあまり遭いません。A〜Z はどの表でも同じ番号だからです。表を間違えても英語は正常に出ます。
日本語はそうはいきません。Shift_JIS での あ の番号と UTF-8 での番号は違い、バイト数(2 対 3)まで違います。だから表を間違えた瞬間に 文字数までずれて読めなくなります。
典型的な二つの形があります。
ã“ã‚“ã«ã¡ã¯ — UTF-8 で保存したものを西欧の表で読んだ場合。3バイトなので文字数が大きく増えます。コï¾ï¾†ï½¿ï½º — Shift_JIS の半角カナが別の表で読まれた場合。
どちらでも 元の番号はファイルにそのまま残っています。表を選び直せば原文が戻ります — 文字化け直しがやっているのはそれです。
今は何を使えばいいか
迷わず UTF-8 です。新しく作るファイル・Web ページ・データベースはすべて UTF-8 にしてください。Shift_JIS が要るのは古いファイルを読むときだけです。
古いファイルが残っているなら UTF-8 に変換しておくほうが安全です。今のツールはたいてい UTF-8 を前提にするので、開くたびに化ける危険があります。ファイルタブにアップロードすれば判定して UTF-8 に変換します。
ひとつ厄介な例外が Excel です。目印のない UTF-8 ファイルを今もローカルのコードページで読んでしまいます。その話は Excel で CSV が文字化けするとき に別途まとめました。