Excelで文字化けせずに開けるCSVをRubyで作るついでに文字コードについて学んでみた。(あいまい)
RubyでCSVファイルを作り、Excelで開くと文字化けする。 解決法を探した所、この記事の通りやったら解決できた。
BOMなしUTF8をBOMつきUTF8にするためのワンライナー
解決できたはいいが、やっていることが全くわからないのでいろいろ調べてみる。
そもそもExcelで文字化けする理由は何か?
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 0201 – Wikipedia
JIS X 0208 – Wikipedia
補助漢字 – Wikipedia
JIS X 0213 – Wikipedia
Unicode – Wikipedia
コンピュータに認識できるようにいろいろな文字にラベルを貼っているらしい。そしてそのラベルを貼った文字の集合を符号化文字情報というとのこと。
コンピューター上では最終的には全てが0と1のデジタルで表現されます。もちろん文字もそうです。ですので符号化文字集合だけがあっても実際にそれをコンピューター上ではどのような0,1の並びで表現するのか、ということが決まっていないとコンピューターでは扱えません。その0,1の並びを定義しているのが文字符号化方式です。
(中略)文字符号化方式の具体例
ISO-2022-JP – Wikipedia
EUC-JP – Wikipedia
Shift_JIS – Wikipedia
Microsoftコードページ932 – Wikipedia
UTF-8 – Wikipedia
UTF-16 – Wikipedia
UTF-32 – Wikipedia
そしてラベルが貼ってある文字集合をコンピュータが読み込めるようにする方式を定義してあるのが、文字符号化方式らしい。UTF-8やShift_JISが含まれるとのこと。
つまり文字を整理した文字集合と、文字集合をコンピュータに読み込ませるための方式の2つに規格があるらしく、Excelが文字化けした今回のケースは、文字集合をUTF-8方式でコンピュータに認識できるように表現しなくてはいけないのにShift_JISで読みこんだから文字化けしたということのようだ。
この図はわかりやすい。
ちなみに名前だけよく聞くUnicodeは世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えでつくられているらしい。
Unicode は世界で使われる全ての文字を共通の文字集合にて利用できるようにしようという考えで作られ、Unix、Windows、Mac OS X、Plan 9[2]、Javaなどで利用されている。