なぜ起きる?謎の呪文「文字化け」の正体と仕組みをどこよりも分かりやすく解説!
ネットサーフィンをしていたり、メールを開いたりしたときに、画面が「縺ゅ>縺縺」や「????」といった謎の呪文になって困ったことはありませんか?
この現象を「文字化け(もじばけ)」と呼びます。
「パソコンが壊れた!」「ウイルスかも!?」と焦る必要はありません。今回は、文字化けがなぜ起きるのか、その裏側の仕組みを中高生やプログラミング初心者の方にも分かりやすく丁寧に解説します!
そもそも「文字化け」ってなんなの?
一言でいうと、文字化けとは「コンピューター同士の『言葉の通訳』がウマくいかなかった現象」です。
システムがクラッシュする「エラー」というよりは、プログラムがデータを読み込むときにちょっとした勘違いをしてしまった「バグ(設定ミス)のようなもの」だと言えます。
仕組みを理解するために、3つのステップで見ていきましょう!
文字化けが起きる仕組み(3つのステップ)
ステップ1:コンピューターは「数字」しか読めない
まず大前提として、スマホやパソコンは「あ」とか「A」という文字をそのまま理解することはできません。彼らは「0」と「1」の数字しか読めないんです。
そのため、人間が文字を入力するとき、コンピューターの内部では以下のような「背番号(暗号帳)」を使って数字に変換されています。
- 「あ」の背番号は【1番】
- 「い」の背番号は【2番】
この、文字に背番号を割り当てたリストのことを、専門用語で「文字コード」と呼びます。
ステップ2:世界には「ちがう種類のリスト」がたくさんある
ここからが文字化けの原因です。 実は、この「背番号のリスト(文字コード)」は世界に1つだけではなく、時代や国、会社によって違う種類のものがいくつも作られてしまいました。
例えば、
- リストA(日本語用): 【1番】=「あ」
- リストB(英語圏用): 【1番】=「謎の記号」
というように、同じ「1番」でもリストによって中身が全然違う、ということが起きてしまいます。
ステップ3:通訳のすれ違いで「文字化け」が発生!
文字が化けるのは、「送った人が使ったリスト」と「受け取った人が使ったリスト」がズレてしまったときです。
例えばこんなシチュエーション
あなたが友達に、リストA(日本語用)を使って「あ(1番)」というメッセージを送ったとします。
相手のスマホが設定ミスなどの理由で勘違いして、リストB(英語圏用)で「1番」を読み込んでしまいました。
すると、友達の画面には「あ」ではなく、リストBの1番に登録されている「謎の記号」が表示されてしまいます。
これが文字化けの正体です。 暗号化するときと、それを解読するときで「ちがう暗号帳」を使ってしまったために起きる処理のミスなんですね。
応用編 文字化けの「2大呪文」で見分ける原因
プログラミングやITの世界では、文字化けした画面をよーく見ると、「どの暗号帳を間違えて使ったか」が予想できるようになります。
代表的な2つのパターンを紹介します。
パターン①:「縺ゅ>縺縺」と難しい漢字が並ぶ
- 原因: 「UTF-8(世界共通リスト)」で作られた文字を、「Shift_JIS(日本の古いリスト)」で無理やり読み込むとこうなります。
- 仕組み: UTF-8は1文字を3つの数字で表すことが多いのですが、Shift_JISは1文字を2つの数字で読みます。数字の区切り方がズレてしまうため、漢字の引き出しから全然違う難しい漢字が引っ張り出されてしまうのです。
パターン②:「ããã」とアルファベットや記号が並ぶ
- 原因: 「Shift_JIS(日本の古いリスト)」で作られた文字を、「欧米(英語圏)のリスト」で読み込んでしまったときに起きます。
- 仕組み: 日本語を表すための数字を、英語圏のコンピューターが「あ、これはアクセント付きのアルファベットの並びだな」と勘違いして表示している状態です。
最近、文字化けを見かけなくなった理由は?
昔(ガラケーの時代やインターネットの黎明期)は、会社や国ごとにバラバラのリストを使っていたため、本当によく文字化けが起きていました。
しかし最近では、「地球上のすべての文字を1つの巨大なリストにまとめよう!」という世界共通のルール(Unicode / UTF-8)が定着しました。
そのため、現在のスマホや最新のWEBサイトでは文字化けを見かける機会がかなり減っています。
現代でも起きる「最後の砦」
今でもたまに、iPhoneからパソコンに絵文字を送ると「□」や「?」に化けることがありますよね。これは「機種依存文字(環境依存文字)」と呼ばれるもので、新しい絵文字などの数字の割り当てが、まだ相手の古いパソコンに対応していないときなどに起こります。
まとめ プログラマーを目指す人へ
プログラミング(PythonやJavaScript、Web制作など)を勉強していると、高確率でこの文字化けの壁にぶつかります。
文字をデータ(数字)に変えることを「エンコード」、数字を文字に戻すことを「デコード」と言います。
プログラムを書くときは、「エンコードとデコードで、まったく同じ暗号帳(基本はUTF-8)を使うように正確に指示を出す」ということを意識してみてくださいね!
もし次に文字化けを見かけたら、「あ、コンピューターが暗号帳を勘違いしちゃったんだな」と、優しい目で見てあげてください。
