【Python】pandasでEUC-JPの全角ハイフンがUTF-8に上手く変換できない際の対処法

2024.01.26

データアナリティクス事業本部のueharaです。

今回は、pandasでEUC-JPの全角ハイフンがUTF-8に上手く変換できない際の対処法をご紹介します。

検証環境

前提として、今回は以下の端末で検証をしています。

  • MacBook Pro(macOS Monterey)

全角ハイフンが上手く変換できない事象について

以下の EUC-JP の文字コードのcsvファイルを用意します。

sample_eucjp.csv

1,関東-123
2,北海道-ABC
3,九州-456

こちらをpandasの read_csv() 関数で読み取り、そのままUTF-8で to_csv() 関数により出力してみます。

test.py

import pandas as pd

df = pd.read_csv("sample_eucjp.csv", encoding="EUC-JP", header=None, dtype=object)

df.to_csv("sample_utf8.csv", encoding="UTF-8", index=False, header=False)

出力された sample_utf8.csv は以下になっています。

sample_utf8.csv

1,関東−123
2,北海道−ABC
3,九州−456

少し分かり辛いかと思いますが、UTF-8で出力されたハイフンの方が短くなっています。

EUC-JPでは であったものが、UTF-8で出力したことにより となっています。

何故か?

はEUC-JPのコードで A1DD となっていますが、対応表を確認するとUTF-8のコードは E28892 となっています。

UTF-8のE28892は、先に示した と一致します。

したがって、変換上はEUC-JPの がUTF-8の となるのは仕様のようです。

ちなみに (E28892) は半角ハイフン -(2D) とも微妙に違います。(ややこしい...)

変換元の全角ハイフン はUTF-8のコードだと EFBC8D になります。

上記は波ダッシュ問題と呼ばれる既知の問題のようです。

対処法

ファイルを一旦cp932の文字コードで出力し、それを再度読み込みUTF-8で出力すると元のファイルと同じ全角ハイフンを出力することができます。

test2.py

import pandas as pd

df = pd.read_csv("sample_eucjp.csv", encoding="EUC-JP", header=None, dtype=object)

df.to_csv("sample_cp932.csv", encoding="cp932", index=False, header=False)

df2 = pd.read_csv("sample_cp932.csv", encoding="cp932", header=None, dtype=object)

df2.to_csv("sample_utf8_v2.csv", encoding="UTF-8", index=False, header=False)

上記により出力されたファイルは以下のようになっていました。

sample_utf8_v2.csv

1,関東-123
2,北海道-ABC
3,九州-456

きちんと想定した全角ハイフンで出力されていることが分かります。

最後に

今回は、pandasでEUC-JPの全角ハイフンがUTF-8に上手く変換できない際の対処法をご紹介してみました。

参考になりましたら幸いです。

参考文献