文字化けはなぜ起きるのか?
はじめに
エンジニアに限らず、パソコンを使っていると一度は文字化けに遭遇したことがあると思います。
開くエディタによって読めるようになったり、ググって出てきた通りに操作したら読めるようになったり、でもどうにもならないこともあったり。
この厄介な文字化けは一体どうして起きるのでしょうか?
文字コード
ある程度パソコンに詳しい人だと、文字化けは文字コードが違うから、という予想をするのではないでしょうか?
昭和〜平成前半に生また人なら昔の携帯電話を思い出して、機種依存文字を使っているからと思いつくかもしれません。
エンジニアならとにかくUTF-8を使っておこう。だいたいShift-jisが悪いって思ったりするでしょうか。
その考えは間違っていませんが、しかし何故文字コードが違うと文字化けするのでしょう?
機種依存文字は何故使ってはいけないのでしょう?
CPUの目線から文字の世界を覗いてみましょう。
文字は数値
まず、大前提としてコンピュータの頭脳CPUは0と1しか理解できません。
0は電流が切れている、1は電流が流れているということです。
(実際には完全に止まっているわけではなく、強弱で判別していると聞いたこともありますが、私はCPUメーカーの技師ではないのでこう表現しています。要するに2択しか分からないと伝わればいいので。)
それで、この0と1の組み合わせで全てを表現しています。
この2進数の各桁のことをビットといいます。聞いたことあると思います。
プログラムを動かす時はこんな感じで2進数の数字がズラズラっとメモリに配置されて、これをCPUが読み込んで翻訳します。
110000001100010011001000110011001101000011010100110110001101110011100000111001
この2進数の羅列の事を機械語といいます。
なんて書いてあるかわかりますか?
そうです。「0123456789」ですね。
え?わかりませんか?
うーん、確かに、ダラダラと長すぎて読みづらいですね。
じゃあ8進数になおして短くしてみましょう。
1と0の羅列を8個づつで区切ってそれぞれを変換します。
そしたらこれになります。
30 31 32 33 34 35 36 37 38 39
はい、薄めで見てください。なんか見えてきませんか?
まだわからない人はそれぞれの一桁めだけを読んでください。
ね、「0123456789」って読めるでしょう?
ちなみにこの 30 は さんじゅう じゃないです。 さんぜろ です。
Javaで表現すると 0x30 です。
この 30 31 32 という16進数の数字2桁の組み合わせが1バイトです。
さっきの例は10バイトってことですね。
これも聞いた事あると思います。というかIT業界にいてバイト?初耳って人はいないと思います。
さて、どうして 30 が 0になり、31が 1になるんでしょうか?
そう、これを決めるのが文字コードってわけです。
ちなみにこれはASCIIコード。
また、UTF-8はASCIIコードを内包しているので、同様に翻訳できます。
で、まあどの文字も1バイトなら良かったんですが、1バイト=FF=16*16=256 なのでどう考えても日本語を表現するには足りません。
中国語なんか足りるわけありませんね。
半角英数字だけなら足りるのですが・・・
ね、だから半角英数字って色々な場面で登場するんですよ。
文字化けしにくいし。扱いやすくコンピュータと相性がいい。
さて、1バイトで足りなければ2バイト以上組み合わせればもっとたくさんの文字が表現できますね。
そこで色々な文字コードが登場しました。
しかし、文字コードによって文字と数字の対応表が違っています。
だから文字コードが違うと文字化けします。
たとえば「あ」という文字を表現するのに、
E3 81 82
82 A0
と、まったく違う対応をします。
しかもですよ。
上の2つの文字コード、1文字に使うバイト数も3バイトと2バイトとなっていますね。
ということは、Shift_JISで
E3 81 82
を読み込んだら、E3 81 まではもしかしたらたまたまその数字にヒットする文字があるかもしれませんが、82 が千切れた状態になりますね。
当然化けます。
さらに、その後ろの文字が前に全て1バイトずれます。だから後ろ全部化けます。
これが文字化けの正体です。
おわりに
いかがでしたか?
今回は機械語の世界を覗いてみましたが、このくらいなら意外と理解できたのでは?
それでは73 65 65 20 79 6f 75 20 61 67 61 69 6e 2e 0a
(see you again.)
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion