PHP 5.2.12 の文字エンコーディング関連の修正点

PHP 5.2.12 がリリースされました。

Release Announcement にも載っていますが、以前、日記に書いた htmlspecialchars() が Shift_JIS の一部の文字を通してしまう問題は、セキュリティ問題として修正されました。

他にもセキュリティ問題の修正がありますので、バージョンアップした方が安全です。PHP 5.2.12 では、htmlspecialchars() の他にも、mbstring 関連でも文字エンコーディング関連の問題が修正されましたので、メモしておきます。

htmlspecialchars()/htmlentities() で文字エンコーディングを指定した場合に、一部の不正な文字が排除されない問題の修正

以前の日記(最新の PHP スナップショットでの htmlspecialchars()/htmlentities() の修正内容について)に書いたように、修正されました。
最近になって、UTF-8サロゲートペアの問題も修正され、PHP 5.2.12 にもこの修正が含まれています。
また、PHP 5.3 系では、PHP 5.3.2 でこの修正が反映される予定です。

mb_convert_encoding() が UTF-16 の BOM 付き Little Endian の文字列を正しく変換できない問題の修正

以前の日記で書いた、UTF-16(BOM 付き Little Endian) を mb_convert_encoding() で変換すると文字列が壊れる問題が修正されました。
PHP 5.2.12 で修正され、PHP 5.3.2 でも反映される予定です。これで、UTF-16 を扱う場合でも、正しく変換できるようになりました。以下は PHP 5.2.12 の実行結果です。

<?php
// テスト(UTF-16: BOM 付き Little Endian の文字列)
$str = "\xFF\xFE\xC6\x30\xB9\x30\xC8\x30";
var_dump( bin2hex( mb_convert_encoding( $str, "UTF-16", "UTF-16" ) ) );
var_dump( mb_convert_encoding( $str, "UTF-8", "UTF-16" ) );
string(12) "30c630b930c8"
string(9) "テスト"

mb_detect_encoding() の第3引数(strict)を有効にすると、文字エンコーディングの判定が厳格になる

mb_detect_encoding() は文字コード判定として使用できるかで書いた問題です。
Patch を PHP-dev メーリングリスト に投稿したところ、取り込んでいただけました。

この修正によって、以下のコードは、TRUE となりますが、

<?php
// Shift_JIS として有効な先行バイトのみで判定
var_dump( "SJIS" === mb_detect_encoding( "\x81", "SJIS" ) );
bool(true)

以下のコードは、FALSE になります(PHP 5.2.12/PHP 5.3.2 以降)。

<?php
var_dump( "SJIS" === mb_detect_encoding( "\x81", "SJIS", TRUE ) );
bool(false)