[PHP-dev 1489] Re: mbstring の文字列変換、文字エンコーディング検出の関連の問題について

Moriyoshi Koizumi mozo @ mozo.jp
2009年 8月 19日 (水) 00:37:22 JST


小泉です。

レポートありがとうございます。

基本的に送っていただいたパッチをそのままコミットしていいと思うのですが、ダブルチェックしたいのでちょっとお時間をください。

2009/8/16 komura <komura.db2r1e @ gmail.com>:
> 1. mb_convert_encoding() で UTF-16(Little Endian) の文字列を変換すると結果が
>   壊れる
>
>   UTF-16(Little Endian) で作成した文字列を変換すると、1文字目が壊れます。
>   Shift_JIS や EUC-JP に変換した場合でも、1文字目が壊れます。
>   変換元文字列が UTF-16(Big Endian) の場合は問題ありません。

エンコーディング名 "UTF-16" は "UTF-16BE" や "UTF-16LE" と違い、BOM
によってエンディアンを判定します。手元で試したところ、BOM が \xff \xfe でも \xfe \xff
でも問題が発生することが確認できました。

> 2. mb_detect_encoding() で、第3引数(strict)を TRUE にしている場合、最後の
>   1文字(バイト)が不正でも不正にならない

修正はパッチの通りかと思います。

> 3. mb_detect_encoding() で、strict 指定しているのに、一部の不正な UTF-8 の
>   文字列が不正にならない
>
>   2. の Patch を当てた場合に顕在化する問題です。mb_detect_encoding() で、
>   第3引数(strict)を TRUE にしている場合でも、UTF-8 の不正な文字列
>   (\xc0\x00, \xd0\x00, ..., \xfd\x00) が不正になりません。

まさか、と思ってパッチを見たらその通りの問題で笑ってしまいました。該当箇所の c != 0 の意図がさっぱり分かりませんねぇ。

>
> 4. mb_check_encoding() で UTF-16(Little Endian) を判定すると、必ず false を
>   返す

これは先にも書きましたが、BOM を見てエンディアンを判定することによるものなので問題はないように思えます。


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