[pgsql-jp: 36502] JISX0212領域でのstrpos

ISHIDA Akio iakio @ mono-space.net
2005年 12月 9日 (金) 07:22:51 JST


こんにちは。石田@苫小牧市です。

EUC_JP環境でのJIS X 0212領域の扱いについて気になる動作が
あったので識者のご意見をお聞きしたいです。

PostgreSQL は 8.0.4、データベースエンコーディング、
クライアントエンコーディングはともに EUC_JP です。
また、検証に私が作ったhextostrという
ユーザ定義関数を使っています(strtohexの逆の動作をするものです)。
http://mono-space.net/doc/func_hextostr/

以下、実行結果にJIS X 0212領域の文字が出てきますが、
メールにはふさわしく無いので、別の文字に置き換えています。


現象
strpos(text, text)で、別の文字にマッチしてしまう。
----
ishida=# SELECT hextostr('8faaa18faae1'), hextostr('8faae1');
 hextostr | hextostr
----------+----------
AT(*1)  |T(*2)

ishida=# SELECT strpos(hextostr('8faaa18faae3'), hextostr('8faaa1'));
 strpos
--------
      1       -- 問題無し
(1 row)

ishida=# SELECT strpos(hextostr('8faaa18faae3'), hextostr('8faae1'));
 strpos
--------
      1       -- 2になるはずでは?
(1 row)

----

処理内容を正しく理解している自信は無いのですが、
pg_euc2wchar_with_len (src/backend/utils/mb/wchar.c) で

        else if (*from == SS3 && len >= 3)
        {
            from++;
            *to = *from++ << 8;
            *to |= 0x3f & *from++;
            len -= 3;
        }

と 0x3f と AND をとっているときに桁落ちしてしまっている
ために、pg_wchar同士の比較が正しくない結果を返してしまう
のでははないかと推測するのですが、いかがでしょうか。


(*1) 実際にはおそらく LATIN CAPITAL LETTER A WITH ACUTE と
 LATIN CAPITAL LETTER T WITH CEDILLA
(*2) 実際にはおそらく LATIN CAPITAL LETTER T WITH CEDILLA

-- 
ISHIDA Akio <iakio @ mono-space.net / ishida @ cycleof5th.com>



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