🗂

CSVファイルの文字コードは何が良いのか?

2023/11/12に公開

こんにちは。沖縄でWEBエンジニアをしているishikiです。
顧客とやりとりしているCSVファイルをシステムで使用するときに、文字コードで詰まったので備忘録を書きます。

お題

下記要件を満たすCSVの文字コードは何か?

  • 顧客がデータ確認するため、CSVファイルをExcelで開いたときに文字化けさせない。
  • CSVファイルのデータをPythonのPandasライブラリで扱いたい

文字コードとは?

この記事がわかりやすかった。
記事のポイントだけ述べると、

  • 文字コードは、「符号化文字集合(文字の集まり) 」と「符号化文字方式(文字の変換方式)」で構成される。
  • エンコーディングルールとして選ぶのは符号化文字方式である。
文字の集まり 文字の変換方式(例)
Unicode UTF-8, EUC-JP, ISO-2022-JP
JIS X 0208 Shift-JIS, Windows-31J(CP932)

文字コードの変換方法

Linuxコマンド(nkf)

## 文字コードの確認
nkf --guess hoge.csv
## 文字コード変換 (変換失敗を検知できない)
nkf --overwrite -w8 hoge.csv

Python

文字コードの変換可否

  • 表の下に行くにつれて対応文字が増える。
  • よって、上から下に変換する場合は問題ない。
  • 下から上に変換する場合は、文字化けリスクが上がる。
符号化文字方式(文字の変換方式) 説明
ASCII 符号化文字方式の始まり。半角英数記号文字を定義したもの。7ビット。
Shift-JIS 日本語対応した符号化文字方式の始まり(多分)。本記事ではベンダ拡張前のShift-JISを指す。
CP932 本記事では Windows-31J(MS932) と同じものを指す。
UTF-8 / UTF-8(BOM付き) Unicode系で一番利用されている。

結論

Excelから作成できるCSVの文字コードはCP932UTF-8(BOM付き)である。
CP932のCSVファイルに変換した場合、ExcelにCP932非対応文字が含まれている場合は、文字化けする。
文字化けをチェックする手間を減らすなら、CSVファイルはUTF-8(BOM付き)へ変換すればOK。
(既存システムがCP932にのみ対応している場合は、Python等で事前に非対応文字が含まれていないかチェックする。)

[補足]
Pandasについてふれるのを忘れていましたが、
pandas.read_csvではCP932UTF-8(BOM付き)のどちらにも対応していたので特に考慮することはありません。
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
https://docs.python.org/3/library/codecs.html#standard-encodings

参考

Pythonで学ぶ文字コード
とほほの文字コード入門

深く理解したい方はこちら

プログラマのための文字コード技術入門 (読みたい)

Discussion