[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 メーリングリストの案内