pg_dump の EUC の文字化け

結論:eucJP-ms が使われていました。(よく知らなかったんですが、データベースまわりでは常識っぽいことなんでしょうね。たぶん)


あるシステムの PostgreSQL に格納されているデータを pg_dump で出力し、 RDBMS を使わずにデータを活用しようとしたときのお話。

今はデフォルトで UTF-8 となってるようですが、対象とした PostgreSQL の設定では EUC で出力されるようになっていました。しかし、そのダンプファイルをテキストエディタで開くと、ごくごく部分的な文字化けが生じていました。確認してみると、ローマ数字や丸囲み数字などのいわゆる機種依存文字が使われている箇所。

pg_dump 文字化け」で調べてみるといろいろ方法が載っていましたが、主に古い PostgreSQL から新しいバージョンに移行する際の話が多く、 PostgreSQL の設定を書き換えたりする方法など、今回の目的とはマッチしませんでした。



PostgreSQL 内部ではこれらの文字もちゃんと扱えているわけなので、データは(文字コードの強制変換などで)壊れてはいないはず。だとしたら、何らかの方法で変換できるはず。……ともうちょっと調べると、Ruby1.9でEUC-JPの機種依存文字を処理する - ぱろっと・すたじおという記事を発見。うっひょー

なるほど Shift-JIS と cp932 のような関係のものが EUC にもあったのね。これで解決だ!



と思って cp51932 指定でいってみたら、またも変換エラー。

今度は商標登録記号(丸 R 記号)が記載されている場所でした。しかもよく見てみると、この箇所は \x8F\xA2\xEE でとなっている。調べてみると、別の亜種である eucJP-ms は3バイトで表現される JIS 補助漢字に対応しているとあり、この商標登録記号なんかは JIS 補助漢字として収録されているよう。



とりあえず以下のように UTF-8 に変換して使いました。

#!/usr/local/bin/ruby
# vim:set fileencoding=UTF-8:
# †

open("pg_dump.utf-8", "w:utf-8") do |wio|
    open("pg_dump.euc", "r:euc-jp-ms") do |rio|
        rio.each do |line|
            wio.print line
        end
    end
end

しかし、文字コード。それも特殊文字まわりは本当に面倒くさいな。