[pgsql-jp: 42112] Re: ポスグレ初心者の疑問(初投稿です)
Kubo Takehiro
kubo @ jiubao.org
2024年 11月 10日 (日) 23:30:41 UTC
UTF-8 から SJIS への変換テーブル作成時、変換先が2つあるときは以下のURLに
記載された範囲が除外されるようです。
https://github.com/postgres/postgres/blob/REL_17_0/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl#L22-L26
「Ⅰ」(U+2160) の変換先 0x8754, 0xFA4A のうち、NEC拡張文字の 0x8754 が除外され、
IBM拡張文字の 0xFA4A が残るため、IBM拡張文字の「Ⅰ」になるのでしょう。
対策案
1. PostgreSQL側の文字コードをSJISにしてもらい、文字コードの変換を回避。
理由があってUTF-8にしているのなら無理でしょうけど
2. PostgreSQL側で文字コード変換をするのではなく、プログラム側で行う。
プログラムからの接続の文字コードをUTF-8にして、SQL実行前にはプログラム側で
SJIS -> UTF-8 の変換を行い、クエリの結果などはプログラム側で UTF-8 ->
SJIS の変換を行う。プログラム側で変換するのならば好きな変換先を選べる
3. PostgreSQLからSJISの文字列を受け取った後、IBM拡張文字の「Ⅰ」を
NEC拡張文字の「Ⅰ」に変換。
ただし、無条件に 0xFA, 0x4A の2バイトを 0x87, 0x54 の2バイトに変換すると
例えば「日J」の「日」の2バイト目 0xFA と J (0x4A) も変換対象となってしま
うので注意。文字列の先頭から文字境界を考慮しつつ調べていく
邪道な案
4. PostgreSQL本体に手を加え UTF-8 から SJIS への変換テーブルを変更
unicode.org から CP932.TXT をダウンロードし
src/backend/utils/mb/Unicode/UCS_to_SJIS.pl を書き換えて実行し、
src/backend/utils/mb/Unicode/utf8_to_sjis.map を置き換えて
PostgreSQL本体を再ビルド
あと、MLに投稿するとき CC をつけるのは止めたほうが良いかと。
CCのアドレスも見えたので。
pgsql-jp メーリングリストの案内