0

ICU 用の PHP のintlラッパーで現在利用可能な機能を使用して、文字列のエンコーディングの有効性をどのようにチェックしますか? (例: 有効な UTF-8 をチェック)

mbstring、iconv()、および PCRE で実行できることはわかっていますが、この質問で intl に特に関心があります。

4

2 に答える 2

0

掘り下げて、ICU unorm2_normalize() documentationを見つけました。その pErrorCode 出力パラメーターは興味深いものです。標準の ICU エラー コードは、utypes.hの 620 行目あたりから始まります。だから私はこのテストスクリプトを試しました:

$s = 'tête-à-tête';
echo "normalizer_normalize(\$s) >> " 
     . var_export(normalizer_normalize($s), 1) . "\n";
$s = "\xFF" . $s;
echo "normalizer_normalize(\$s) >> " 
     . var_export($r=normalizer_normalize($s), 1) . "\n";
if ($r===false)
    echo "normalizer_normalize() error: " 
         . intl_get_error_message() . "\n";
// which outputs:
normalizer_normalize($s) >> 'tête-à-tête'
normalizer_normalize($s) >> false
normalizer_normalize() error: Error converting input string to UTF-16: U_INVALID_CHAR_FOUND

したがって、それに基づいてテストを行い、次の 3 つのエラー コードを探すことは、UTF-8 エンコーディングが正しくないことを示す適切な指標になると思います。

U_INVALID_CHAR_FOUND 文字変換: マップできない入力シーケンス。U_TRUNCATED_CHAR_FOUND 文字変換: 不完全な入力シーケンス。U_ILLEGAL_CHAR_FOUND 文字変換: 入力シーケンス/入力単位の組み合わせが不正です。

または私が怠け者だと感じているとき、私はただ使うことができます

normalizer_normalize($s)===false

ところで:ICU API仕様の次の行に混乱しています:

pErrorCode 標準 ICU エラー コード。その入力値は U_SUCCESS () テストに合格する必要があります。そうでない場合、関数はすぐに戻ります。出力でU_FAILURE () をチェックする か、関数チェーンで使用します。(詳細については、ユーザー ガイドを参照してください。)

「関数はすぐに戻る」というフレーズはテストの再実行を奨励していますが、「関数」は unorm2_normalize() または U_SUCCESS() を参照していますか? 何か案は?

于 2011-07-09T21:31:27.297 に答える