[pgsql-jp: 39312] Re: 'encoding "EUC_JP" has no equivalent in "UTF8"' の理由

Hiroki Kataoka kataoka @ interwiz.jp
2008年 3月 26日 (水) 15:23:26 JST


片岡です。

樋口佳之 さんは書きました:
> 私の場合、サーバーのエンコーディングをEUC_JPからUTF8に切り替えたいという
> 1度切りと思われる必要性でこの作業を試しています。

 それでは、まずはSJISに変換したらどうでしょう?

 CP51932とSJISの間は機械的な演算だけで変換できるので、PostgreSQLの
EUC_JP→SJIS変換のソース(euc_jp_and_sjis.cのeuc_jp2sjis関数)から例外処
理(SS3の処理とUDC1の処理)を取り除いてしまえば、CP51932をSJISに変換でき
ます。その後、UTF8に変換すればよろしいかと。UNICODEの変換マップをトライ
アンドエラーで1つずつ追加していくより楽そうです。

> 甘いでしょうか?

 文字化けという観点では、よろしいんじゃないでしょうか。

 PostgreSQLのSJISとUTF8に関して言えば、Windowsのそれと同じ仕様になって
いますので、その2つのエンコーディングを使っている限りは(よく分からない
で使っていても)文字化けには遭遇しにくいと思います。

# 分かってれば何てことはないんですが

> それから、大変恐縮ですが、例えば「はしごたか」のような文字が、
>  eucJP-ms
>  CP51932
>  UTF8
> で、それぞれどんなコードになるのかわかるような資料とか、参考になるホーム
> ページとかありましたら教えていただけないでしょうか?

 まとまった良い情報ソースは私も知らないのですが、eucJP-msとCP51932の違
いに関しては、

http://ja.wikipedia.org/wiki/EUC-JP

の表が分かりやすいかもしれません(ちなみに「JIS X 0212」はWindowsのシフ
トJISにも含まれていません)。

 シフトJISというエンコーディングはその仕組み上、句点で120区の文字を表現
できます。一方EUCは(「面の切り替え」を導入しない限り)94区までです。で
すからシフトJISをEUC-JPに機械的に変換すると、シフトJISの95区以上が変換で
きません。実はこれがそのままCP51932の特徴となっています。

 WindowsのシフトJISは下記の文字セットで構成されてます。

  1区〜  8区 0x8140〜0x84BE 記号
 13区        0x8740〜0x879C NEC機種依存文字
 16区〜 47区 0x889F〜0x9872 JIS第1水準漢字
 48区〜 84区 0x989F〜0xEAA4 JIS第2水準漢字
 89区〜 92区 0xED40〜0xEEFC NEC選定IBM拡張文字
 95区〜114区 0xF040〜0xF9FC ユーザ定義文字 1880文字
115区〜119区 0xFA40〜0xFC4B IBM拡張文字

 ちなみに話題の「はしごたか」は、NEC選定IBM拡張文字(SJISでEEE0)とIBM
拡張文字(SJISでFBFC)の二箇所に登録されている文字です。

-- 
Hiroki Kataoka <kataoka @ interwiz.jp>



pgsql-jp メーリングリストの案内