PostgreSQLエラー「ERROR: invalid byte sequence for encoding "EUC_JP": 0x93ab」の原因と対処方法

psqlでSQLファイルを指定して実行した際に、「invalid byte sequence for encoding "EUC_JP"」といったエラーが出る時がある。

《例》
psql:test.sql:2001: ERROR: invalid byte sequence for encoding "EUC_JP": 0x93ab
この例の場合、psqlでtest.sqlというファイルを指定して実行したところ、EUC_JPの文字エンコーディングでは無効なバイト列「0x93ab」がtest.sqlの2001行目で見つかった、というエラーのようだ。
このような場合の多くが、psqlで読み込もうとしたファイルの中で記述している文字のコードに誤りがある。例えば、ファイルの中身の文字列全てをEUC_JPの文字コードにしておくべきところを、SHIFT_JIS(シフトJIS)など別の文字コードを混在させてしまった場合だ。多くの場合、問題となるのはSHIFT_JISの機種依存文字だと思う。
今回の例のように、EUC_JPファイルの中にSHIFT_JISが混在してしまった文字化けファイルを修正する場合、以下の手順で修正できる可能性がある。

1 テキストエディタ(秀丸エディタ等)でEUC_JPとしてファイルを開き、PostgreSQLのエラーメッセージで指摘されている行で文字化けが発生していることを確認する。この時、文字化けしているのは1文字だけではなく、前後の複数の文字も巻き添えにして文字化けしていることを確認する。
2 テキストエディタ(秀丸エディタ等)でシフトJISとしてファイルを開く
 ※EUC_JPの文字コードで書かれている部分は文字化けしてしまうが、慌てないこと。
3 「invalid byte sequence for encoding "EUC_JP"」で指摘された文字コードに相当する文字列をエディタの検索機能で検索し、文字化けと無縁そうなシングルバイトの文字列に置換する。
 ※今回の例では、文字コード「0x93ab」に相当するSHIFT_JISの文字コード「騰」を検索し、「mojibake」という文字列に書き換える。
4 ファイルをシフトSHIFT_JISのまま保存する。
 ※秀丸エディタでしか試していないが、この場合でもEUC_JPの文字コードで保存できている。
5 ファイルを再度開くと、文字化けしていた部分が「mojibake」になり、さらに「mojibake」の前後の文字列の文字化けも解消されていることを確認する。「mojibake」の部分は、本来の文字列が分かり次第、適宜修正。

※以下に、文字コード、SHIFT_JISで見える文字列、本来の文字(機種依存文字)の組み合わせの例を示す。
機種依存文字は当ページを閲覧しているOSやブラウザ等の環境の相違により、正常に表示されていないかもしれないので、「代替表現」の部分を見て、何を記述しているかを推測して頂ければと思う(本当は画像で掲載すればよいのだが、面倒だったので省略)。

文字コードSHIFT_JISで見える文字列本来の文字(機種依存文字)代替表現
0x93ab I
0x93ac II
0x93ad III
0x93ae IV
0x93af V
0x93b0 VI
0x93b9 (株)
0x93bb Tel
0x94bc
0x96fe 厄ケ

※文字コードが0x96feのものは、シフトJISに該当コードがなさそうに見えた。「厄ケ」という「厄」と「ケ」の組み合わせが機種依存文字「髙」(代替表現「高」)に該当しているように見えたが、間違っているような気もする。

上記のような例は他にもいっぱいあると思うが、私個人でまとめられたのはここまで。今後、新たに同様の問題に遭遇すれば追記するかも(気力があれば・・・)。

個人的な思いとしては、「invalid byte sequence for encoding "EUC_JP"」というエラーへの一番の対処策は、まずはpsqlでファイル読み込みを実行する前に、ファイルをテキストエディタで開いてみて文字化けするかどうかをチェックし、文字化けしていたら文字化けしないように修正をした上でpsqlを実行する、ということだと思う。しかし、文字化け箇所が大量にあると、上記のような置換作業は大変労力がかかるし、時間の無駄だと思うので、極力避けるようにしたい。そう、本来は、何故ファイルが文字化けしているかの原因と改善策を考えなくてはいけないのだろうなぁ・・・。

前へ

自宅玄関前の庭に飛び石を設置した

次へ

2010年7月に街中で流れている「Hello, Again 〜昔からある場所〜」