4

スクリプトからの警告と通知を解決しようとしています。スクリプトには次のものが含まれます。

$clean_string = iconv('UTF-8', 'UTF-8//IGNORE', $supplier.' => '.$product_name);

私が理解しているように、この行の目的は、スクリプトの元の作成者が意図したように、UTF-8 以外の文字を文字列から削除することですが、明らかに入力に UTF-8 以外の文字があると、iconv が不正な文字の警告をスローします。

これを解決するために、私の考えは次のようなことをすることでした:

$clean_string = iconv(mb_detect_encoding($supplier.' => '.$product_name), 'UTF-8//IGNORE', $supplier.' => '.$product_name);

しかし奇妙なことに、検出されたエンコーディングとして mb_detect_encoding() が返さUTF-8れます!

アクセント付きの文字 e ( é) は、この動作を引き起こす文字の例です。

検出と変換の間にマルチバイト ライブラリを混在させていることに気付きましたが、iconv ライブラリにエンコーディング検出関数が見つかりませんでした。

mb_convert_encoding() 関数を使用して文字列を UTF-8 にクリーンアップすることを検討しましたが、PHP のドキュメントでは、表現できない文字がどうなるかが明確ではありません。

私は PHP 5.2.17 を使用しており、glibc iconv 実装、ライブラリ バージョン 2.5 を使用しています。

文字列を UTF-8 にクリーンアップする方法や、この動作が発生する理由についての洞察を提供できる人はいますか?

4

1 に答える 1

3

あなたの例:

$string     = $supplier . ' => ' . $product_name;
$stringUtf8 = iconv('UTF-8', 'UTF-8//IGNORE', $string);

PHP5.2を使用するとうまくいくかもしれません。それ以降のPHPバージョンでは、入力が正確にUTF-8でない場合、incovは文字列を削除します(空の文字列を取得します)。あなたへのメモとしては、あなたはそれに気づいていないかもしれません。

次に、mb_detect_encodingDocsを使用して、元のエンコーディングについて調べます。

$string     = $supplier . ' => ' . $product_name;
$encoding   = mb_detect_encoding($string);
$stringUtf8 = iconv($encoding, 'UTF-8//IGNORE', $string);

すでにコメントでリンクしているように、mb_detect_encoding 魔法をかけていて動作しません。それはあなたを助けようとします、しかし、それは非常に良いエンコーディングを検出することができません。これは主題によるものです。strictモードをtrueに設定してみることができます。

$order      = mb_detect_order();
$encoding   = mb_detect_encoding($string, $order, true);
if (FALSE === $encoding) {
    throw new UnexpectedValueException(
        sprintf(
            'Unable to detect input encoding with mb_detect_encoding, order was: %s'
            , print_r($order, true)
        )
     );
}

その次に、2つのライブラリ(iconvおよびマルチバイト文字列)間でエンコーディングドキュメントの名前を変換する(および/またはサポートされているエンコーディングに対して検証する)必要がある場合もあります。

これが、少なくともいくつかのことが機能しない理由と、エラーケースを見つけて、標準のPHP拡張機能を使用して入力をフィルタリングする方法をよりよく理解するのに役立つことを願っています。

于 2012-09-21T10:46:39.393 に答える