文字コードと文字化けの正体 〜なぜ「縺ゅ≠」や「????」という呪文が生まれるのか?〜

2026-11-04 / シリーズ「コンピューティングの芯」第20話

1. 素朴な疑問:なぜ突然「縺ゅ≠」という宇宙人の文字が出るの?

古いメールを開いたとき、あるいは役所や銀行からダウンロードしたCSVファイルをExcelで開いた瞬間、画面全体がこんな不気味な文字列で埋め尽くされたことはありませんか?

縺ゅj縺後→縺・#縺悶>縺セ縺吶??・ス・ス・ス・ス・ス・ス・ス

「ひえっ……! ウイルスに感染したの!? ファイルが壊れちゃったの!?」

画面いっぱいに広がる怪奇現象に、誰もがパニックになります。 しかし、安心してください。ファイルは1ミリも壊れていませんし、ウイルスでもありません。

何が起きているのかを一言で言えば、**「英語の小説を、ロシア語の辞書を使って無理やり日本語に翻訳しようとした(辞書の取り違え)」**だけです。

なぜ、コンピュータは文字を表示するだけで、こんなにも頻繁に辞書を取り違えてしまうのでしょうか? その裏側には、コンピュータが抱える「根本的な障害」と、世界の言語をめぐる泥臭い歴史のドラマが隠されています。


2. 概念の芯:コンピュータは「文字」という概念を知らない

第4話で学んだ大原則を思い出してください。 コンピュータは「0」と「1」、すなわち「数字」しか理解できません。

コンピュータのメモリ(作業机)やSSD(書類棚)の中に、「あ」や「A」という形の文字をそのまま保存することは物理的に不可能です。 では、どうやって画面に文字を表示しているのでしょうか?

答えは、子どもの暗号遊びと同じ**「出席番号の対照表(文字コード表)」**です。

👤 人間の世界 文字『A』 変換して保存 📖 文字コード表 (暗号の対照表) 65番 =『A』 66番 =『B』 67番 =『C』 保存される実体 🖥️ コンピュータの世界 数字『65』 (2進数:01000001)
  1. 文字を書くとき: 人間がキーボードで「A」と打つと、パソコンは対照表をめくって「Aは65番だな」と確認し、ハードディスクに数字の「65」を書き込みます。
  2. 文字を読むとき: パソコンは保存されている数字「65」を読み、対照表をめくって「65番は『A』の形だな」と確認し、画面のマス目(第5話の画素)に「A」の絵を描きます。

これが文字表示のすべての真相です。 **コンピュータが保存しているのは、文字そのものではなく「ただの番号(文字コード)」**なのです。


3. 歴史の歪み:英語圏の傲慢が生んだ「1バイト(ASCII)の壁」

1960年代、コンピュータを生み出したアメリカの技術者たちは、世界で最初の共通ルール**「ASCII(アスキー / American Standard Code for Information Interchange)」**を作りました。

彼らは、英語を使うために必要な文字をすべて数え上げました。

これらを全部足しても、たったの128個にしかなりません。 第4話で学んだとおり、2進数7桁(7ビット)あれば $2^7 = 128$ 通りの数字を表現できます。 キリよく8ビット(1バイト=256通り)使えば、半分以上スペースが余る計算です。

1バイト(8ビット = 256通り) 前半 0〜127番(7ビット分) 🔤 ASCIIコード 英語・数字・記号で満杯 後半 128〜255番 空きスペース(未定)

アメリカの技術者たちは大満足してこう思いました。 「1文字を1バイト(数字の0〜255)で管理すれば、全人類のすべての文字を永遠に扱える完璧なシステムが完成した!」

日本語の絶望:漢字が数千文字もある!

しかし、このシステムが太平洋を渡って日本にやってきた瞬間、巨大な悲劇が起きました。 日本の技術者たちは頭を抱えました。

「冗談じゃない! 日本語には『ひらがな』『カタカナ』だけでなく、『漢字』が何千文字もあるんだぞ! 1バイト(256個)の枠に入るわけがないだろう!」

英語は26文字を組み合わせるだけですが、日本語の漢字は日常で使うものだけで2,000文字以上、人名まで含めれば何万文字も存在します。 1バイト(256通り)というアメリカ人が作った小さな箱には、日本語はどうあがいても1文字も入りきらなかったのです。


4. 職人技の苦肉の策:「Shift_JIS」と恐怖の「ダメ文字事件」

そこで日本の技術者たちは、脳から汗を流しながら、ある凄まじい曲芸(ハック)を思いつきました。 それが、1980年代初頭にMicrosoftなどが開発した**「Shift_JIS(シフトジス)」**です。

2バイトを使って漢字をねじ込む

「1バイトで足りないなら、**2バイト(16ビット=約65,000通り)**使えばいいじゃないか!」 しかし、ただ2バイトにすると、昔のアメリカ製プログラム(ASCII前提のソフト)がすべてエラーで動かなくなってしまいます。

そこで彼らは、ASCIIコードの**「使われていない後半の隙間(128〜255番あたり)」**に目をつけて、こう決めました。 「もしこの隙間の数字が出てきたら、それは文字の終わりじゃないぞ! 次のもう1バイトと合体させて、2バイトがかりで1つの漢字として解読しろ!(数字の解釈をシフトせよ)」

1バイト目が『0x41』 (普通のASCII範囲) 1バイトだけで判定 🔤 半角英字『A』 1バイト目が『0x82』 (隙間の特別な数字!) 後ろの『0xA0』と2つ合体! 🇯🇵 日本語の『あ』

このアクロバティックな職人技のおかげで、英語と日本語が1つの文章の中で綺麗に同居できるようになりました。 Windows 95や日本のガラケーは、すべてこのShift_JISで動いていたのです。

日本の折りたたみ式携帯電話(ガラケー)、カシオ EXILIMケータイ CA003の実物
Shift_JISの全盛期を支えた日本のガラケー(カシオ EXILIMケータイ CA003)。日本語メールも文字コード表の取り違えによる文字化けと隣り合わせだった。写真:春夏秋冬奏慈(パブリックドメイン/Wikimedia Commons)

しかし起きた大惨事:「ダメ文字」の呪い

ところが、この無理矢理な詰め込みは、後に世界中のプログラマーを狂わせる**「ダメ文字事件」**を引き起こしました。

プログラムの世界において、半角の円マーク・バックスラッシュ(\)は、第16話でも触れたように「次の文字を特別な命令として扱う(エスケープする)」という超重要で神聖な記号(コード番号 0x5C)です。

しかし、Shift_JISで使われている無数の漢字の中には、**偶然にも「2バイト目の数字がたまたま 0x5C(\)と完全に一致してしまう漢字」**が何十個も存在していたのです!

⌨️ 人間がプログラムに『予定表』と打ち込む Shift_JISの2バイト目を分解すると… 『予』『定』『表(0x95 + 0x5C)』 機械(コンパイラ)の誤解:「最後にエスケープ記号(\)があるぞ! 後ろのプログラムの命令を無効化(コメントアウト)しろ!」 💥 プログラムが構文エラーで大爆発!

たとえば、ゲームを作っていて「ソリティア」と書いたり、業務システムで「予定表」と書いた瞬間、パソコンは漢字の後ろについている \ に反応して、後ろの命令を誤作動させ、プログラムがクラッシュして止まりました。 当時のプログラマーは、「なぜか『表』という文字を入れると画面が真っ白になる」という怪異に怯え、わざわざ「予定表\」と手動で打ち消しのバックスラッシュを書き足すという、涙なしには語れない泥臭い戦いを強いられていたのです。


5. 奇跡の統一:Unicodeの誕生と、ナプキンに書かれた「UTF-8」

日本語だけではありませんでした。 中国語(Big5など)、韓国語(EUC-KR)、ロシア語(KOI8-R)……世界中の国々が、自分たちの言語をパソコンで使うために**「勝手な独自の文字コード表」**を乱立させました。

その結果、何が起きたか? 日本のWebページをアメリカのパソコンで開くと、アメリカのパソコンは「英語の対照表」で読もうとするため、画面全体が文字化け(Mojibake)して読めなくなりました。 インターネットが世界を繋いだ瞬間、人類は**デジタル空間の「バベルの塔」**に直面したのです。

世界を1つにする「Unicode(ユニコード)」の理想

1980年代末、世界のエンジニアたちがついに立ち上がりました。

「もう国ごとにバラバラの辞書を作るのはやめよう! 英語も、日本語も、アラビア語も、古代文字も、絵文字(🍣や🔥)も、地球上のあらゆる文字に、世界共通でたった1つの『絶対的な出席番号』を振ろう!」

こうして誕生したのが**「Unicode(ユニコード)」**です。 Unicodeは、世界中の文字に「U+3042(ひらがなの『あ』)」という絶対的な番号(コードポイント)を割り振っていきました。

レストランの紙ナプキンに描かれた「UTF-8」の革命

しかし、ここでもう1つの難問が立ちはだかりました。 世界中の数万文字に番号を振るには、1文字あたり「3バイト〜4バイト」のデータ量が必要です。

もし世界中の文字をそのまま4バイトで統一したらどうなるでしょうか? 「ほとんどアルファベットしか使わない英語圏の人々」からすれば、今まで1バイトで済んでいたファイルサイズが、突然「4倍」に激太りすることになります。世界中のサーバーと回線がパンクしてしまいます。英語圏のエンジニアたちが納得するはずがありません。

この絶対絶命の対立を、わずか一晩で解決した天才がいました。 第7話のUNIX哲学やC言語の生みの親である伝説のプログラマー、ケン・トンプソンです。

英語(ASCIIの128文字) 『A』『1』など 1バイトだけで表現 データ量は昔のまま最小限!✨ ヨーロッパ言語・キリル文字 2バイトで表現 必要に応じて長さを可変! 日本語・中国語・韓国語 3バイトで表現 漢字もすべて完全に網羅! スマホの絵文字 (🍣・🥺) 4バイトで表現 最新の文化までカバー!

1992年9月のある夜、ケン・トンプソンは同僚と入ったニュージャージー州のダイナー(レストラン)で、紙ナプキンの裏にペンを走らせ、ある計算式を書き上げました。 それが、現代の世界を完全に統一した最強の文字コード**「UTF-8」**です。

UTF-8の驚くべきアイデア。それは、**「文字によって長さを1バイト〜4バイトまで自由に変える(可変長)」**という設計でした。

  1. **英数字は「昔のASCIIと完全に同じ1バイト」**で表現する(データ量は増えない! 昔のソフトもそのまま動く!)。
  2. **日本語などの漢字は「3バイト」**で表現する。
  3. **絵文字などの特殊な文字は「4バイト」**で表現する。

この恐るべき合理性と美しさに、世界中の技術者が脱帽しました。 現在、インターネット上に存在するWebサイトの98%以上が、このUTF-8を採用しています。 あなたがスマホで何気なく送っているLINEのメッセージも、この紙ナプキンから生まれた数式の上を流れているのです。

触って試す:文字コードの体験

🔤 文字コードの体験(UTF-8のバイト数)

文字ボタンを押すと、その文字がUTF-8では何バイトの数字列(16進数)になるかを表示します。英字は1バイト、日本語は3バイト、絵文字は4バイト——文字によって長さが変わる「可変長」こそ、UTF-8の発明の核心です。

まずは文字ボタンを押してみてください。


6. 実践:プロは見れば一瞬で分かる「文字化け解読シート」

最後に、仕事で文字化けに遭遇したとき、**「画面を見れば、どの辞書を取り違えたかが一発で分かるプロの鑑識眼」**を伝授しましょう。

💥 文字化けが発生した! どんな化け方をしている? パターン①:縺ゅ≠ 💡 UTF-8のテキストを Shift_JISで開いた! (現代のWindowsで最も多い事故) パターン②:?????? 💡 対応する文字フォントが 入っていない! (外国語や最新の絵文字で発生) パターン③:アイウエオ 💡 EUC-JPとShift_JISの 衝突! (古いLinuxとWindowsの連携事故)

パターン①:「縺ゅ≠縺?(しなじな文字)」

パターン②:「????(クエスチョンマークの羅列)」

「BOM(ボム)」という小さな親切、大きなお世話

WindowsとMac/Linuxの間で今も争いの種になっているのが**「BOM(Byte Order Mark / バイト順マーク)」**です。 Windowsのメモ帳は、親切心からファイルの先頭に「これはUTF-8ですよ!」と宣言する目に見えない3バイトの記号(0xEF 0xBB 0xBF)を勝手に埋め込みます。

しかし、UNIXやWebの世界では、この記号のせいでプログラムが「1行目に謎のゴミがあるぞ!」とエラーを吐いて止まる事故が多発します。 「BOM付き」か「BOM無し」か。歴史のしがらみは、今も技術者たちの間で小さな火種を残し続けています。

文字化けは、機械の故障ではありません。 世界中に散らばる多種多様な文化や言語を、何とかして「0と1の数字」の中に閉じ込めようと格闘してきた、人類の涙ぐましい知恵の足跡なのです。


📝 3行で頭に入る「試験・実務の要点まとめ」


確認クイズ

📝 確認クイズ(3問)