この記事で分かること
- 文字コードについてざっくり理解する
- 文字化けが発生するメカニズムについて
- なぜUTF-8がよく使われるのか?
この記事では、超初心者向けに文字コードとは何か?について解説しています。
プログラミングに限らず、パソコンやコンピュータを使っていれば誰でも文字化けが発生した経験があると思います。
今回は、プログラミングの知識が無い人が読んでも分かるように、なるべく難しい言葉は使わずに文字コードについて分かりやすく説明します。
5分ほどで読める内容なので、ぜひ最後まで読んでみて下さい!
文字コードとは?
文字コード(または、エンコーディング)には UTF-8
/ SJIS
/ EUC
などの種類があり、Wikipediaでは以下の様な説明がされています。
文字コード(もじコード)は、コンピュータ上で文字(キャラクタ)を利用する目的で各文字に割り当てられるバイト表現。もしくは、バイト表現と文字の対応関係(文字コード体系)のことを指して「文字コード」と呼ぶことも多い。
https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89
この説明では、日本語が難しすぎて少し分かりにくいかと思いますので、具体例を挙げながら、もう少し噛み砕いて説明してみたいと思います。
具体的な例
例えば、「あ」という文字をコンピュータに保存したいとします。
UTF-8語 / SJIS語 / EUC語 で「あ」の文字を保存すると、それぞれ
- UTF-8語では E3 81 82 の3バイト
- SJIS語では 82 A0 の2バイト
- EUC語では A4 A2 の2バイト
のバイト列でコンピュータに保存されることになります。
このように、ある文字をどのようなバイト列で表現するかを決めたルールを文字コードと言います。
なぜ文字化けが起こるのか?
上記の例の通り、「あ」という文字を保存するケースについて考えてみます。
UTF-8語を話す人が、「あ」という文字をファイルに保存すると中身は E3 81 82 の3バイトになります。
そのファイルを、SJIS語しか話せない人が読み取ると、とりあえずSJIS界のルールに当てはめて E3 81 を「縺」という文字と解釈します。
そして 82 の部分は当てはまる文字がないので単に無視します。
かくして、UTF-8の「あ」という文字が、SJISの「縺」という文字に文字化けすることになります。
以下のサイトでは、文字コードごとにどのように文字化けが起こるのかを確認することが出来るので、色々と試してみて下さい。
https://csedu.ime.cmc.osaka-u.ac.jp/oer/tools/encode/bitToChar.php?base=16&bitstring=e38182
Javaで文字化けを検知する方法について知りたい方は、以下の記事も参考にして下さい。
-
UTF-8 / SJIS 文字コード変換できない文字を検知する [Java]
この記事では、UTF-8 から Shift-JIS に変換する際に文字化けが発生するかを判定するプログラムを紹介しています。また、文字化けを引き起こす代表的な文字のサンプルもいくつか提示しています。 ...
続きを見る
結論
結論としては、書き込む人と読み出す人の話す言語(文字コード)が違うために文字化けが起こる となります。
しかも、テキストファイルに文字を書き込んだ際に、基本的には どの文字コードで書き込まれたかという情報は記録されません。
ファイルを正しく読むことが出来るかどうかは、完全に読み手任せになってしまうということです。
UTF-8語で書かれたファイルは、UTF-8語を理解できる人にしか読めないということになります。
文字化けを発生させないようにするには、書き手と読み手の文字コードを一致させる必要があります。
なぜUTF-8は便利なのか?
かなりざっくりとした説明になりますが、メリットとして
- ほぼすべての国の文字をUTF-8だけでカバーしている(絵文字なども)
- 違う文字に判定されてしまう誤動作が極めて少ない
- サロゲートペア文字のような特殊なルールが無い
という特徴が挙げられます。
デメリットとしては、エンコード後のサイズがやや大きくなってしまいます。(上記の例でも「あ」という文字がSJISやEUCの1.5倍のサイズになっています)
UTF-8についてもっと詳しく知りたい方は、Wikipediaも参考にしてみて下さい。
https://ja.wikipedia.org/wiki/UTF-8
まとめ
最後に、この記事の内容をまとめます。
要点
- コンピュータで異なる文字コードを扱うと文字化けする可能性がある
- 文字化けが起こる原因は、書き込み側と読み取り側の文字コードが異なるため
- UTF-8は文字コード関連の問題が起こりづらいので便利だが、エンコード後のサイズがやや大きくなる
Windowsでメモ帳を使う際や、プログラムでCSVファイルを扱う際などにも、よく文字コードの問題は発生すると思います。
文字化けなどの問題が起こった場合も、今回覚えた知識が頭の片隅にあれば、その知識を元に原因を調査して行くことが出来ます。
現在広く普及しているUTF-8という文字コードは、比較的不具合が起こりにくく、デメリットが少ないためプログラミングの世界でも一般的に使われています。
しかし、古いシステムや外部システムとのやり取りなど、異なる文字コードでデータをやり取りするケースも依然として行われますので、そのようなケースでも上手く対処できる様になると良いですね!
最後まで読んでいただきありがとうございました!