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

MORIYAMA Masayuki moriyama @ miraclelinux.com
2008年 3月 31日 (月) 17:13:36 JST


ミラクル・リナックスの森山です。

1年ほどまえ PostgreSQL に cp51932 を追加する機会がありながら
作業するといっておきながら、作業をせずに申し訳ありませんでし
た。

Tomoyuki Asakawa wrote:
> このあたり参考になるとおもいます。(って、このプロジェクト どうなったんだ
> ろ?)
>
> http://sourceforge.jp/projects/legacy-encoding
> http://legacy-encoding.sourceforge.jp/wiki/
> http://lists.sourceforge.jp/mailman/listinfo/legacy-encoding-talk-ja
> http://www.ipa.go.jp/about/jigyoseika/05fy-pro/open/2005-1467a.pdf
> http://www.ipa.go.jp/about/jigyoseika/05fy-pro/open/2005-1467d.pdf

PHP に関しては upstream にパッチがマージされ 5.2.1 から CP51932
と ISO-2022-JP-MS が使えるようになっています。また、Perl に関
しては、成瀬氏が別途 Encode::EUCJPMS モジュールを開発されて
CPAN にアップされていますので、そちらを使う事で Perl の Encode
モジュールで cp51932, eucJP-ms, cp50220, cp50221 が変換可能と
なります。(Encode::EUCJPMS をインストールした後で enc2xs -C
を実行しておく事で piconv, convmv でも使えるようになります。)

マイクロソフト標準キャラクタセットを扱う場合の基本的な考え方
は次の通り。

  1. クライアント(ブラウザ)とサーバーでのやりとりは CP932も
     しくは UTF-8 を使う。
  2. スクリプトエンコーディングは、UTF-8(Unicode) もしくは、
     eucJP-ms を使う。
  3. DB はスクリプトエンコーディングに合わせる。

  ※ クライアントとサーバーのやりとりを UTF-8 で行う場合はスク
    リプトと DB も UTF-8 とするが望ましい。

Web ブラウザに表示するエンコーディング、スクリプトエンコーディ
ング、DB のエンコーディングを cp51932 に統一できれば一番楽な
のではないかという考え方もあるかと思いますが実際に使うことを
想定して検討すると一筋縄ではいかないことがわかります。

たとえば、Firefox の EUC-JP では、JIS X 0212 を 3 バイトコー
ドで POST してくるため、cp51932 -> UTF-8 (Unicode) という変換
でエラーが発生するなどの問題があります。

次の 6 つを明確に区別できていなければ、EUC-JP符号化方式での文
字化けの対策をすることは困難という状況と言えると思います。

1. EUC-JP          JIS X 0208, JIS X 0212 (ベンダ拡張なし)
2. cp51932         JIS X 0212 無し (NEC特殊文字、NEC選定IBM拡
                   張文字追加)
3. eucJP-ms        eucJP-open と同一の文字集合で Unicode 変換
                   の違いにより eucJP-ascii, eucJP-0201,
                   eucJP-ms の 3 つが定義されている
                   大文字のローマ数字などの重複定義文字の変換
                   の正式な規定はないため実装依存の可能性を考
                   慮する必要あり。
                   PostgreSQL の EUC_JP。ただし Unicode との変
                   換ではユーザー定義文字の変換は行われない
4. eucJP-ms-ex     eucJP-ms の ユーザー定義文字領域を潰して
                   NEC選定IBM拡張文字追加
5. cp51932-firefox cp51932 に JIS X 0212 を追加
6. cp51932-ex      cp51932-firefox に eucJP-open の 0x8ff3f3
                   〜 0x8ff4fe を追加

4, 5, 6 は私が勝手に名前を付けたものですが、Unicode から
cp51932-firefox, cp519323-ex に変換する際に、重複定義されてい
る文字の優先順位として次のルールにしたがいます。

Unicode -> cp51932-firefox, cp51932-ex 優先順位
  JIS X 0208 > NEC特殊文字 > NEC選定IBM拡張文字 > JIS X 0212

Unicode -> eucJP-ms-ex の優先順位
  JIS X 0208 > NEC特殊文字 > JIS X 0212 + 0x8ff3f3〜0x8ff4fe

  ※ SMAP の草ナギ剛の「ナギ」の文字が NEC選定IBM拡張文字と JIS
    X 0212 の両方で定義されているので、cp51932-ex, eucJP-ms-ex
    は次のような変換となります。

      cp51932-ex  -> Unicode -> cp51932-ex
      F9AC        -> U+5F45  -> F9AC
      8FBCF4      -> U+5F45  -> F9AC

      eucJP-ms-ex -> Unicode -> eucJP-ms-ex
      F9AC        -> U+5F45  -> 8FBCF4
      8FBCF4      -> U+5F45  -> 8FBCF4

cp51932-ex のようなものを追加したとしても、IE の EUC-JP (cp51932)
で JIS X 0212 を表示できませんので。アプリケーション側で、 数
値文字参照形式に変換してやるなどの処理が必要になってくるでしょ
う。

  ※森鴎外の「鴎」の「区」が「區」になっている文字は、JIS X 0212
    に定義されていて NEC選定IBM拡張文字では定義されいません。
    Windows では cp51932 から Unicode への変換で次のような変換
    が行われるので注意が必要です。

      cp51932 -> Unicode
      8FECBF  -> U+4E57(乗) U+FF7D(JIS X 0201 の'ス')

Web アプリケーションなどで文字化けを起こさないようにするために
はユーザーが入力した文字列に対して、次のような処理を行う事が必
要と思われます。(一例)

  0. 文字コードの自動判定は行わない。
     - これは絶対条件。
  1. 符号化方式として正当なバイト列かどうかをチェックする。
     - UTF-8 はもちろんこと、シフト符号化方式、EUC-JP 符号化方
       式でもバイト列の正当性チェックはルーズな変換ルーチンに
       による不具合回避をする意味でもやっておく事をお薦めしま
       す。
     - 特定の不正なバイト列をはじくのではなく正当なバイト列の
       みを通過させるような処理にする。
  2. アプリケーション・ソフトウェアで正しく処理出来る文字やエ
     ンコーディングかどうかをチェックする。
     - 使用するソフトが扱える文字集合が不明な場合は、JIS X 0208
       の文字だけに制限するようにする。
  3. 必要であれば、ここで文字コード変換ルーチンに対して入力文
     字コードを正しく指定して文字コード変換をする。
     - ここでの変換では、シフトJIS符号化方式からEUC-JP符号化
       方式に変換する場合、95区〜120区の扱いに注意すること。
       必要であれは、2 の段階で94区までに制限しておく。
  4. 重複定義されている文字がある場合は、どれか一つのコードポ
     イントに正規化する。
     - 重複定義の文字の問題が原因で検索した文字列がヒットしな
       いという事態が発生した場合に原因究明に時間がかかる事が
       予想されますので注意しておいた方がいいでしょう。
       * EUC-JP符号化方式の「ナギ」や UTF-8 の「〜」など。
  5. 0〜4を通過したものに対してセキュリティ対策を行う事。

このような処理を行っていれば、EUC-JP符号化方式で統一するという
事も可能になってくるでしょう。JIS X 0212 が多い分、シフトJIS符
号化方式よりも考慮すべき点が増え難易度は確実に上がりますが。
ブラウザによって JIS X 0212 を直接 POST してくるものと、数値文
字参照で POST してくるものがありますから入力側では正規化処理、
出力側では JIS X 0212 の数値文字参照への変換処理が必要になって
くるでしょう。(cp51932 に変換できない JIS X 0212 は捨てるとい
う選択肢もあるでしょう。)

PostgreSQL に cp51932ex を追加して幸せになれるのか私には自信が持てません。

そうこうしているうちに Unicode 5.1.0 がリリース直前という状況
になってきています。

  http://www.unicode.org/versions/Unicode5.1.0/

個人的には、次の拡張が日本語情報処理にとってインパクトがある
とみています。
---------------------------------------------------------
A major feature of Unicode 5.1.0 is the enablement of
ideographic variation sequences. These sequences allow
standardized representation of glyphic variants needed for
Japanese, Chinese, and Korean text. The first registered
collection, from Adobe Systems, is now available at
http://www.unicode.org/ivd.
---------------------------------------------------------

--
ミラクル・リナックス株式会社
森山 将之 moriyama @ miraclelinux.com
Web: http://www.miraclelinux.com/



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