[PHP-dev 1362] Re: PHP 5.2.0 以前と PHP 5.2.1RC1 以降で発生する一部の文字コード変換の非互換について

MORIYAMA Masayuki moriyama @ miraclelinux.com
2007年 1月 29日 (月) 20:16:57 JST


森山です。

PHP 5.2.1RC4 に対して、SJIS、eucJP、ISO-2022-JP の変換が、PHP 5.2.0 と同
一となるようにするパッチを作成しました。

パッチ対象       : php-5.2.1RC4
パッチファイル   : php-5.2.1RC4-mbstring-20070129.patch
アップロード場所 : https://sourceforge.jp/projects/legacy-encoding/

※注意
  CVS から php_5_2_1RC4 を checkout してきて、パッチを当てた後、php5
  ディレクトリで ./buildconf --force を実行してからビルドする必要があり
  ます。

  例)
    php-5.2.1RC4-mbstring-20070129.patch をダウンロード
    $ cvs -d :pserver:cvsread @ cvs.php.net:/repository checkout \
    -r PHP_5_2 php5
    $ cd php5
    $ patch -p1 < ../php-5.2.1RC4-mbstring-20070129.patch
    $ ./buildconf --force
    $ ./configure --enable-zend-multibyte --enable-mbstring \
    --enable-mbstr-enc-trans --enable-mbreg

テストは、上記アップロード場所にある、legacy-encoding-0.1.1.tar.gz にて
全文字についての変換テストを実施しました。(テストする場合は、CLI 版の
php をインストールする必要があります。)

SJIS、EUC-JP、ISO-2022-JP、SJIS-win(CP932) は、PHP 5.2.0 の変換と同一で
ある事を確認しました。

eucJP-win に関しては、glibc 等の eucJP-ms との変換の不一致を解消する為、
PHP 5.2.0 の変換に対して、次のような変更がなされます。

PHP 5.2.0
=========
eucJP-win       Unicode   eucJP-win
------------    -------   ------------
\xAD\xE2     → U+2116 → \x8F\xA2\xF1
\x8F\xA2\xF1 → U+2116 → \x8F\xA2\xF1
\x8F\xA2\xC3 → U+00A6 → \x8F\xA2\xC3
                U+FFE4 → \x8F\xA2\xC3
\x8F\xA2\xB7 → U+007E → \x7E

PHP 5.2.1RC4 + php-5.2.1RC4-mbstring-20070129.patch
===================================================
eucJP-win       Unicode   eucJP-win
------------    -------   ------------
\xAD\xE2     → U+2116 → \xAD\xE2     …… (1)
\x8F\xA2\xF1 → U+2116 → \xAD\xE2     …… (1)
\x8F\xA2\xC3 → U+FFE4 → \x8F\xA2\xC3 …… (2)
                U+00A6 → \x8F\xA2\xC3 …… (2)
\x8F\xA2\xB7 → U+FF5E → \xA1\xC1     …… (3)

(1) … "No." (NUMERO SIGN) は、Unicode → eucJP-win の変換で NEC特殊文字
       のコードポイントに変換される。
(2) … \x8F\xA2\xC3 (BROKEN BAR) は、TOG/JVC の eucJP-ms の変換に従う。
(3) … \x8F\xA2\xB7 JIS X 0212 TILDE は、TOG/JVC の eucJP-ms の変換に従
       う。

PHP 5.2.0 の変換との差分
========================
  - eucJP-win の変換の修正
  - CP51932, ISO-2022-JP-MS の追加
      (SJIS-win, eucJP-win との相互変換が行える)

PHP 5.2.1RC4 の変換との差分
===========================
   - SJIS, EUC-JP, ISO-2022-JP, SJIS-win の変換を PHP 5.2.0 の変換に戻す

eucJP-win の変換も、PHP 5.2.0 と同一とする必要があるようでしたら、
PHP 5.2.0 の ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c を使うよ
うにしてください。

御迷惑をお掛けして申し訳ありませんでした。

以上、よろしくお願いいたします。

Rui Hirokawa wrote:
> 廣川です。
> 
> コミットした私のチェックもが甘かったようです。
> 申し訳ありません。
> 
> 意図しない変更ということですので,修正案がPHP 5.2.1に
> 間に合うようでしたらコミットしたいと思います。
> また,仮に間に合わないようでも何らかの形でパッチを公開できればと思います。
> 
> On Thu, 25 Jan 2007 10:30:12 +0900
> MORIYAMA Masayuki <moriyama @ miraclelinux.com> wrote:
> 
>> ミラクルリナックスの森山です。
>>
>> 混乱をさせてしまあ申し訳ありませんでした。
>>
>> komura wrote:
>>> もう少し分かりやすく表にすると以下のようになります。
>>>
>>>  (EUC-JP:0xA1C1, SJIS:0x8160) を UTF-16 に変換
>>>  +-----------+-----------+--------------+
>>>  |           | PHP 5.2.0 | PHP 5.2.1RC3 |
>>>  +-----------+-----------+--------------+
>>>  | SJIS      | 301c      | ff5e (**)    |
>>>  +-----------+-----------+--------------+
>>>  | SJIS-win  | ff5e      | ff5e         |
>>>  +-----------+-----------+--------------+
>>>  | EUC-JP    | 301c      | ff5e (**)    |
>>>  +-----------+-----------+--------------+
>>>  | eucJP-win | ff5e      | ff5e         |
>>>  +-----------+-----------+--------------+
>> 次のようにすべきところを、table_unicode_jis.h の修正をしてしまったため、
>> 上記のような変換になってしまいました。意図しない変更という事になります。
>>
>> (EUC-JP:0xA1C1, SJIS:0x8160) を UTF-16 に変換
>>  +-----------+-----------+--------------+
>>  |           | PHP 5.2.0 | PHP 5.2.1RC3 |
>>  +-----------+-----------+--------------+
>>  | SJIS      | 301c      | 301c (**)    |
>>  +-----------+-----------+--------------+
>>  | SJIS-win  | ff5e      | ff5e         |
>>  +-----------+-----------+--------------+
>>  | EUC-JP    | 301c      | 301c (**)    |
>>  +-----------+-----------+--------------+
>>  | eucJP-win | ff5e      | ff5e         |
>>  +-----------+-----------+--------------+
>>
>> 後ほど、詳細をお送りいたします。
> 
> 



PHP-dev メーリングリストの案内