【詳細③】文字化けはなぜ起きるのか:CSVとExcelの問題を中心に

文字化けが起きる、基本のパターン

 W3Cは、文字コードが分からないと、データの内容が読めなくなるだけでなく、検索エンジンで見つからなかったり機械が正しく処理できなかったりすると説明しています [K1]。
 文字化けが起きる基本のパターンは、「保存した文字コード」と「読むときに想定した文字コード」が違うことです。

 W3Cは、1つ大事な注意点を挙げています。「ページの中で、別の文字コードを宣言しただけでは、バイトは変わらない」ということです。
 宣言した文字コードで、実際に保存し直す必要があります [K1]。

BOMとは

 BOM(ビーオーエム、バイト・オーダー・マーク)は、ファイルの先頭に付ける「この文字コードです」という目印のバイト列です。
 WHATWGの標準では、UTF-8のBOMは「0xEF 0xBB 0xBF」の3バイトで、ブラウザなどがこの目印を見つけたら、それを最優先して文字コードを判断するとされています。これは、実際に使われているデータとの互換性のためです [K4]。

 UTF-8は本来、バイトの並び順(バイトオーダー)の問題がありません。
 そのため、UTF-8でBOMを付けるのは、「このファイルはUTF-8です」という目印として使う意味合いが強くなります。

注記:「UTF-8にバイトオーダーの問題がない」という説明は、
   UTF-8が1バイト単位の方式であること(RFC 3629)から導いた私の補足です。
   UTF-16とUTF-32では、バイトの並び順が問題になります。

CSVをExcelで開くとき

 Microsoftの公式サポートページによると、UTF-8で保存されたCSVファイルは、BOM付きで保存されていればそのまま普通に開けます。BOMがない場合は、次の方法で開きます [K5]。

  • 「データ」タブの「データの取得」から、「テキストまたはCSVから」を使う(Power Query)
  • 「テキストから(レガシ)」の取り込みウィザードを使う

 つまり、BOMなしのUTF-8のCSVをダブルクリックで開くと、Excelが別の文字コードとして解釈して文字化けすることがあります。
 「システムが出力したCSVをExcelで開いたら、文字化けした」という相談の典型的な原因です。対策は、次のどちらかです。

  • BOM付きのUTF-8で出力する:ダブルクリックで開ける
  • 取り込みの機能を使って開く:文字コードを自分で選べる

注記:Microsoftのページには、「BOM付きなら普通に開ける」
   「BOMがなければ、取り込みの機能を使う」と書かれています。
   「ダブルクリックで開くと文字化けする」という具体的な状況の説明は、
   私の経験込みでこの記述から導いたものです。
   使っているExcelのバージョンやOSの設定によって、動きが変わる可能性があります。

CSVの文字コードは決まっていない

 このシリーズの「データ形式」の記事で紹介したとおり、CSVについてまとめたRFC 4180は文字コードを1つに決めておらず、「charset」というラベルで示せる、としています。
 また、UTF-8を基本とする改訂案は、正式な標準ではなく草案の段階です。CSVを受け渡すときは、文字コードを事前に相手と取り決めておくことが大切です。

 一方JSONは、システム間でやり取りするときはUTF-8を使うよう決められています。
 BOMは付けてはいけません。CSVとJSONでは文字コードの扱いが違うため、注意が必要です。

「見た目が同じ文字」が一致しない問題

 文字コードが同じUTF-8でも、別の問題が起きることがあります。

 GoogleのRE2の資料は、正規表現などの処理はUnicodeの「コードポイント」を単位に動き、文字の「正規化」(組み立て方をそろえる処理)は行わないと説明しています。
 例えば、「ü」(ひとつのコードポイント)と、「u」に上の点(結合文字)を重ねた見た目が同じ文字列は、別のものとして扱われ一致しません。そうした一致が必要なときは、検索する文字列と検索される側のデータの両方を事前に正規化しておくのが、一番簡単な方法です [K6]。

注記:日本語でも、濁点つきの文字(「が」など)には、1文字で表す方法と、
   「か」と濁点を組み合わせる方法があり、同じことが起こりうると考えられます。
   これは上の資料の考え方を当てはめた推測で、資料に日本語の例があるわけではありません。

発注・運用の前に確認したいこと

  • CSVなど、ファイルを受け渡すときの文字コードとBOMの有無を、事前に決めているか
  • Excelで開く運用があるなら、BOM付きのUTF-8にするか、取り込みの手順を利用者に案内するか
  • 検索やデータの突き合わせで、「見た目は同じ」なのに一致しない文字がないかテストしているか
  • 実際の日本語データ(旧字体、機種依存の文字、絵文字を含む)を使って、受け渡しのテストをしているか

注記:この4点は、上の資料から整理した確認項目です。
   資料がこの形のチェックリストを示しているわけではありません。

参照元

[K1] W3C Internationalization, Character encodings for beginners — https://www.w3.org/International/questions/qa-what-is-encoding

[K4] WHATWG, Encoding Standard — https://encoding.spec.whatwg.org/

[K5] Microsoft Support, Opening CSV UTF-8 files correctly in Excel — https://support.microsoft.com/en-us/excel/opening-csv-utf-8-files-correctly-in-excel [K6] Google, RE2(README) — https://github.com/google/re2

総集編に戻る

コメント

タイトルとURLをコピーしました