Excelで文字化けせずに開けるCSVをRubyで作るついでに文字コードについて学んでみた。(あいまい)

RubyCSVファイルを作り、Excelで開くと文字化けする。 解決法を探した所、この記事の通りやったら解決できた。

BOMなしUTF8をBOMつきUTF8にするためのワンライナー

解決できたはいいが、やっていることが全くわからないのでいろいろ調べてみる。

そもそもExcelで文字化けする理由は何か?

UTF-8 でエンコーディングされたCSVファイルを開く

UTF-8エンコーディングされたCSVファイルをExcelで開くと、下図のように文字が化けてしまう場合があります。Excelでは何も指定がない場合はファイルをShift-JISで開く動作のため文字化けが発生します。

指定がないとUTF-8エンコーディングされたCSVファイルをShift-JISで開いてしまうらしい。でBOMヘッダを付けてあげるとUTF-8エンコーディングされいているファイルとして認識してくれるらしい。BOMとは文字コードを認識するラベル用な印象?

そもそもUTF-8とかShift-JISとか規格が違うくらいのイメージしか無かったからこれを機会に少し学んで見る。

参考サイト
符号化文字集合と文字符号化方式 - 「プログラマのための文字コード技術入門」を読んだ
符号化文字集合と文字符号化方式の違い

まず符号化文字集合について。文字を表現するためには、まずは文字の集合が必要である。またコンピュータでそれを表すためには、それぞれの文字に一意な番号をふって置く必要がある。例えば、スペースなら32番、「a」なら97番という感じ。番号をふっておけば、その番号に従って、ディスプレイ上に文字を表示することができる。

符号化文字集合の具体例
ASCII – Wikipedia
JIS X 0201Wikipedia
JIS X 0208Wikipedia
補助漢字Wikipedia
JIS X 0213Wikipedia
UnicodeWikipedia

コンピュータに認識できるようにいろいろな文字にラベルを貼っているらしい。そしてそのラベルを貼った文字の集合を符号化文字情報というとのこと。

コンピューター上では最終的には全てが0と1のデジタルで表現されます。もちろん文字もそうです。ですので符号化文字集合だけがあっても実際にそれをコンピューター上ではどのような0,1の並びで表現するのか、ということが決まっていないとコンピューターでは扱えません。その0,1の並びを定義しているのが文字符号化方式です。
(中略)

文字符号化方式の具体例
ISO-2022-JPWikipedia
EUC-JP – Wikipedia
Shift_JISWikipedia
Microsoftコードページ932 – Wikipedia
UTF-8Wikipedia
UTF-16Wikipedia
UTF-32Wikipedia

そしてラベルが貼ってある文字集合をコンピュータが読み込めるようにする方式を定義してあるのが、文字符号化方式らしい。UTF-8Shift_JISが含まれるとのこと。

つまり文字を整理した文字集合と、文字集合をコンピュータに読み込ませるための方式の2つに規格があるらしく、Excelが文字化けした今回のケースは、文字集合UTF-8方式でコンピュータに認識できるように表現しなくてはいけないのにShift_JISで読みこんだから文字化けしたということのようだ。

f:id:rootjun:20160325134329j:plain 符号化文字集合と文字符号化方式 - 「プログラマのための文字コード技術入門」を読んだ

この図はわかりやすい。

ちなみに名前だけよく聞くUnicodeは世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えでつくられているらしい。

Unicode

Unicode は世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えで作られ、UnixWindowsMac OS XPlan 9[2]、Javaなどで利用されている。