定義
コンピューターが文字を理解して画面に表示できるように、文字ごとに固有の数値を対応づけるルールです。コンピューターは0と1でできた電気信号しか扱えないため、文字の形を直接覚えておくことはできません。人間が使うあらゆる文字データを、決められた二進数のコードに変換する規格と、その手順全体を指します。
なぜ文字に番号札をつける必要があるの?
外国の友達と秘密の暗号でメモをやり取りするとき、数字の1はりんご、2はバナナ、と決めた暗号ノートを思い浮かべてみてください。コンピューターと人間が会話するときにも、これとまったく同じ秘密の翻訳ノートが必要なんです。
コンピューターの内部には、スイッチがオンになったりオフになったりする電気信号しか流れていません。コンピューターは、人間が使う「A」や「あ」のような文字の形や意味を、自分では理解できないんですね。電気が通っているか(1)、通っていないか(0)という、2種類の数字だけを覚えて計算できます。
だから、人間がコンピューターに文字を入力するには、文字を数字に置き換える翻訳の手順がどうしても必要になります。たとえばアルファベットの「A」は65番、「B」は66番、というように、あらかじめ約束した番号札を決めておくわけです。キーボードで「A」を押すと、コンピューターは65という数字を記憶装置にしまいます。
このように、文字と数字を一対一で対応づけて記録するルールを文字エンコーディングと呼びます。文字をファイルに保存するときは数字に変え、画面に表示するときはその数字をもう一度文字の形に描き直します。
宇宙語みたいに文字が化ける理由
ネットを見ていたときや、古いテキストファイルを開いたときに、見たこともない漢字や記号で文字がめちゃくちゃになってしまった経験はありませんか。パソコンが壊れたわけではありません。文字を記録した側と、画面に表示する側とで、暗号の帳簿が食い違っているために起きる問題なんです。
たとえば、文書を書いた人は韓国で昔から使われてきた番号札(EUC-KR)を基準に文字を保存したのに、文書を開いたソフトが国際標準の番号札(UTF-8)の帳簿を基準に読んでしまうと、まったく見当違いの文字が飛び出してきます。ハングルを表す番号の組み合わせも、その読み解き方のルールも、帳簿ごとにまるで違うので、解釈がぐちゃぐちゃになってしまうわけです。
このように、文字を保存したときのエンコーディングのルールと、画面に読み込むときに使った解釈のルールが食い違う現象こそが、文字化けの本当の原因です。同じ番号帳簿を基準にそろえてはじめて、文字は本来の姿のままきれいに表示されます。
もう少し正確に言うと:UnicodeとUTF-8
コンピューターが生まれたばかりのころは、英字のアルファベットと数字、基本的な記号に、改行などの制御信号まで加えた128個を収めた「ASCII(アスキー)」というルールひとつで十分でした。ところがコンピューターが世界中に広まるにつれて、ハングル、漢字、アラビア文字など、各国のたくさんの文字を表すために、国ごとにばらばらの独自の番号札が作られはじめました。
ルールが何百通りにも分かれて混乱が大きくなると、「世界中のすべての文字に、たったひとつの固有の番号をつけよう」という大きな約束が生まれました。これが「Unicode(ユニコード)」です。そして、このUnicodeの番号をコンピューターが効率よく読み書きできるようにした、現代の代表的な標準方式が「UTF-8」です。
もう少し正確に言うと、UTF-8が古い文書をそのまま読める範囲は、英字と記号が収められたASCII規格だけです。かつてハングルの文書に広く使われていた完成型やEUC-KRで書かれた文章は、UTF-8で開くと必ず文字が化けます。新しいオールマイティな規格でも、昔のハングルの番号札まで自動で合わせてくれるわけではないからです。
よくある誤解
UnicodeやUTF-8の規格なら、昔に書かれた韓国語の文書もエラーなくそのまま読める。
UTF-8が過去の文書をそのまま読めるのは、英字と記号が中心のASCIIだけです。かつて完成型やEUC-KRで保存されたハングル文書は、UTF-8で開くと文字が化けます。
文字エンコーディングは、文字の形をきれいに飾るフォント(書体)と同じ意味だ。
エンコーディングは文字を特定の数字に置き換えて記録するルールで、フォントはその数字に当たる文字を画面に描き出すビジュアルのデザインです。
日常で出会う場面
メモ帳で古いハングル文書を開いたら宇宙語のように化けてしまい、エンコーディングの設定をEUC-KRに切り替えて直す場合
Webページのコードの先頭にUTF-8のエンコーディング宣言を入れて、世界中のユーザーのブラウザーでハングルも英字も化けないようにする作業
つまり ひとことで
コンピューターが文字を扱えるように文字ごとに固有の番号をつけるルールで、保存するときと読むときに同じルールを使わないと文字が化けます。