Date: 2019/07/15

僕らが文字化けした理由 -パソコンをふんわりわかろう-

システム開発をしている永松です。
「ぼのぼの」という漫画が好きです。

 

パソコンが使えることが就職に有利!なんてもはや過去の話。
今はパソコンは使えて当たり前。
そんな時代です。

しかしそんな時代でも「なんかパソコンが怖い」という人も珍しくないと思います。

あいつら何するかわからないから
隙あらば青い背景で英語出してくるから

怖い理由は色々あると思いますが、おそらく怖さの理由はなぜそうなったかがわからないからじゃないでしょうか。
ならばわからないなら知ればいいじゃないを合言葉にパソコンをふんわりわかろうというシリーズ形式で当分ブログを書かせてもらうかと思います。

うん、シリーズ化したほうが更新楽だしね。

あくまでふんわりなので、正しくはそうじゃない、それは語弊があるような言い回しをすることも多々あるかと思いますが、このシリーズでは概念をふんわりわかってもらうことを主としたいので、その辺りはご了承ください。

まぁ実際次があるかはわかりませんが、第1回目は「 僕らが文字化けした理由」で書かせてもらおうかと思います。

みなさんも1度は経験されたことがあると思いますが、文字化け意味がわからないですよね。

文字コード?SJIS?EUC?UTF-8?8って何?え、UTF-16もあるの?16って・・・

もう訳が分からない言葉のオンパレードです。
なのでふんわり行ってみましょう。

 

ちなみにタイトル見て漫画のタイトルっぽいって思った人、たぶんいい歳。

第1章.そもそもパソコンってどうやってデータを持ってるの?

パソコンって画像、音楽、動画など、色んなデータを扱えますが、そのすべては1と0で表現されます。

ではなぜ1と0なのか。
それは、電気が通っているか電気が通っていないかの2つしか表現出来ないからです。

つまり、「電気が通っている = 1」「電気が通っていない = 0」としているわけです。

ちなみに1と0でしか表現しない単位を「bit(ビット)」と言います。
なので、1bitでは1と0の2パターンしか表現できません。

でも2パターンしか表現できないんじゃ使い物にならない。
そう考えた昔の偉い人は1bitを8つまとめて使うことを思いつきました。
こうすることで、2の8乗の256パターンの表現が可能となります。
この、1bitを8つまとめたものを、パソコンでは1byte(バイト)と言います。

これが思いのほかパソコンと相性がよかったので、パソコンはbyte単位でデータを持つことにしました。

 

さて、ここまでの話はパソコンを理解するのにすごく重要なので、以下にもう一度まとめておきます。
今後このシリーズが続くなら、おそらく当然のように使うやつです。

・パソコンが扱う最小単位は1bit
・1bitは1と0だけ
そのbitを8つまとめると1byte(バイト)に昇格
・1byteは0から255の256パターンが表現できる
パソコンはbyte単位でデータを保持している

第2章.文字はどこから来たのか?

さて、第1章で256通りの表現が出来るようになったパソコンですが、今出来ることは0から255までの数字を扱うだけです。
これではまだ人間が使うにはなかなかに辛い。
やっぱり文字出て欲しい、コミュニケーション取りたい、でもこいつ数字しか扱えない。

偉い人は悩みました。
悩みに悩んだ末、文字と数字を紐づける辞書作っちゃえばいいんじゃない?という発想を得ます。
つまり、「65はA」「66はB」のように、この数字はこの文字だっていう紐づけ(辞書)を作ることにしました。
これが文字コードの始まりです。
また、この文字コードをASCIIコードと呼ぶようになります。

さて、これで問題は解決、ついにパソコンは文字を扱える術を身に着け、人とのコミュニケーションが取れるようになりました。

めでたしめでたし。

第3章.めでたくならなかった人達がいた?

無事文字が扱えるようになったパソコンでしたが、それでは困る人達がいました。
日本人です。

なぜ日本人が困るのか。
ASCIIコードは正しくは「American Standard Code for Information Interchange」の頭文字です。
そう、ASCIIコードは英数字と一部記号しか扱えないのです。
※なので日本人だけじゃなく、中国語、韓国語など、英語圏以外は全員困りました。

これじゃ日本では使えない、なんとかしなくては。
と、また昔の偉い人は考えました。
ASCIIコードみたいに辞書作ればいいじゃないと言いたいところですが、日本語の「ひらがな」「カタカナ」「漢字」を全部合わせたら、軽く256パターン以上あります。
それに英数字も使うので、ASCIIコードはそのままにしなくてはいけない。

悩んだ末出した答えは「1byteじゃ無理!2byteだ!!」というものでした。
つまり、256×256の65,536パターンで辞書を作ろうという壮大なものでした。

きっと作るのは大変だったと思いますが、そんな苦労からSJIS(Shift-JIS)が生まれ、無事パソコンは日本語も表現出来るようになりました。

第4章.SJIS以外の文字コード、いる?

SJISが出来たことで日本語は表現出来るようになりました。
じゃあそれでいいじゃないと思われましたが、まだ困った人達がいました。

Unix系OS(Linuxなど)と呼ばれるパソコンです。
Unix系は無料で使えるを基本概念としたOSです。

当然Unix系も日本語を扱いたいのでSJISを使おうとしましたが、大人の事情で使えませんでした。
ぶっちゃけSJISを使うにはライセンス料が必要だったため、Unixの基本概念に干渉してしまったのです。

そのため、UNIX系は独自の文字コードが必要となり、結果EUCが産み出されました。
EUCもSJISと同じく、2byteで文字を表現しますが、SJISは使えなかったので数値が違います。
具体的にはSJISでは「あ」は「33,440」で表現されますが、EUCでは「42,146」で表現されます。

さて、これでUNIX系OSも救われました、ついにハッピーエンドです。

第5章.以外な被害者の存在?

いい加減なげぇなこの記事と思われてると思いますがまだ続きます。まだハッピーエンドではないからね。

さて、「SJIS」と「EUC」が出来たために、思いっきり被害を被った方がいたのです。
そう、ブラウザを始めとしたテキスト系のソフトです。

なぜ困るのか?
テキストを扱うテキストファイルと呼ばれるファイルには、そのファイルがどの文字コードで書かれているのかという情報がないのです。

しかし実際に「ASCII」「SJIS」「EUC」という3つの文字コードが産まれてしまいました。
産み落とされ、利用され、猛威を振るっているのです。

人が気軽にテキストファイルを開くたびに、テキスト系のソフトはこれはSJISか?EUCか?と自問自答をすることとなります。
特に目立ったのが、多くの人が使うブラウザソフトでした。

彼らはページを表示するたびに自問自答を繰り返しました。
悩んだ末「よし、SJISだ!」と覚悟を決めて表示しても、実はEUCで書かれていると、辞書に合わずに変な文字を垂れ流してしまうという事故が発生してしまいます。

これが「 僕らが文字化けした理由」です。

HTMLの場合はmetaタグと呼ばれる箇所で「これはSJISで作られているよー」とブラウザに教える術が用意されています。
しかし最初の頃はそんな丁寧なHTMLは少なかったですし、そもそもブラウザが対応してなかったりしてました。

じゃあ彼らはどうやって覚悟を決めるのか。
方法はシンプルで、ファイルを最初から読んで行って、SJISでしか表現できない、EUCでしか表現できないコードが出たタイミングで文字コードの覚悟を決めます。

しかし、SJISでもEUCでも使われるコードが続くと、最後は勢いで決めて結果文字化けしてしまうという、頑張ってるのに努力が報われない悲しい結果になってしまいます。

 

こんなに・・・がんばったのに・・・がんばってるのに・・・

 


ちなみに、ASCIIコード内の文字はSJISもEUCも同じなので、半角英数字では基本的に文字化けは発生しません。

第6章.Unicodeは平和の象徴?

そんな時代が数年続きました。

この頃のシステム開発は地獄でした。
ユーザーからはSJISで送られる、サーバーはEUCで動いている、データベースはUTF-8で動いている。
もうどこで文字化けするのか、こいつら隙あれば文字化けしてきやがる、そんな時代でした。
愚痴ここまで。

上記のような問題もありましたが、そもそもEUCは「EUC-JP」と、後ろに「JP」が付いていますが、他の国、例えば中国では「EUC-CN」が使われています。

このように国によってもコードが違っているため、全世界の人が使うようなシステムがものすごく作りにくかったのです。

これは流石にまずいだろうとまた偉い人達が考えてくれました。
その際、文字コードはパソコンの基本なんだし、ライセンスとかそういうの辞めない?って話がされたかは知りませんが、全世界統一のコードを作ろうという計画が持ち上がります。

そうして産まれたのが「Unicode(UTF-8)」です。
全世界で使うものなので、日本語・中国語・韓国語などの英語圏以外のすべての文字も含めました。
そのため、2byteでは収まらなくなったので、UTF-8は1文字を「3byte」で表現します。
「あ」は14,909,826で表現されます。

最近では絵文字も使われるからと、ひらがなや漢字と同じように絵文字も「文字」として登録されており、アップデートもされています。
さらに、もっと拡張したいよねと「4byte」使う「UTF-16」なども出来てきています。

 

ん?3byteだと8で、4byteだと16なの?なんで?
そういうもんだ。

 


最近何かファイルを作るときにUTF-8を使おう、と言われるのはこういう理由からです。
統一規格、素晴らしい。平和、素晴らしい。
これはもう文字コードのオリンピックと言っても過言ではないと思いませんか?
思いませんか、私もそこまでは思いません。

最後に

長かった旅もついに本当のハッピーエンドです。
最近はUTF-8をベースとするようになったので文字化けと遭遇することも少なくなりましたね。
これも偉い人達の努力のたまものです。ありがたく恩恵を受けましょう。

と、当初の予定よりかなり長い文章になっていまいましたが、
ここまで読んでもらって、というか、読む人いるのかという疑問、むしろ恐怖すら感じていますが、この記事で文字化けの理由が「ふんわり」とでも分かってもらえたなら幸いです。

 

おまけ 爆乳は文字化けも救う?

じゃあ他に何を救うんだよって聞かれても困りますが、SJIS・EUCが混在していた時代、「爆乳」は本当に文字化けを直していました。

具体的には、HTMLの1行目にコメントで
<!– 爆乳 –>
と書くと、文字化けが直っていたのです。

これがほんとに、どんな方法よりも確実かつお手軽に直ったので、みんなこぞってHTMLに追加しました。
なのでこの頃、HTMLのソースを見ると先頭に「爆乳」って書かれてました。

さて、種明かしです。
乳という漢字ですが、EUCにのみ存在し、SJISには存在しないコードで定義されています。
そのため、ブラウザは最初に「乳」という文字を見つけた瞬間に、そのファイルがEUCならばEUCで確定できました。
なので、正しくはEUCで書かれたHTMLなら、先頭に爆乳を書くと文字化けが直るとなります。

さて、当然ですがこの法則の文字は「乳」以外にもありますし、そもそも「牛乳」とか「乳酸菌」とかでいいじゃないかと思いますが、ちゃんとHTML書いていても文字化けしていた時代、最後に救いの手を差し伸べてくれた「爆乳」「美乳」「貧乳」「巨乳」に望みを託してしまうのは、男の宿命というものではないでしょうか。


誰も攻めることはできない。
私はそう思います。

 

まぁ、先頭に「美乳」って入った状態で納品してきたのを見たときは、流石にどうなん?とは思いましたが。

 

 

永松

この記事を書いた人

黙々とパソコンに向き合い、少々の無理難題にも粛々と応える、お悟りお開き系エンジニア。AND SPACEの様々なシステム案件を任されているだけでなく、会社全体の運営にも的を射た意見で常々存在感を発揮する。顧客や同僚にいくら駄々をこねられても、淡々と正論を繰り出す姿は、「ナガえもん」と呼ばれて然り。いかなるシステム案件も、最初は粗々で構わないと言い切れるのは、ユーザー目線の「実際の使用感」が大切なことを重々承知しているから。そこからの喧々諤々こそ真骨頂。皆々、度々、多々、救われる。