29

iconv関数でエラーが発生することがあります。

Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]

inconv()にデータを送信する前に、UTF-8文字列に不正な文字が含まれていることを検出する方法はありますか?

4

4 に答える 4

61

まず、テキストが特定の望ましくないエンコーディングに属しているかどうかを検出することはできないことに注意してください。文字列が特定のエンコーディングで有効かどうかのみを確認できます。

preg_match PHP4.3.5以降の[PHPマニュアル]で利用可能なUTF-8妥当性チェックを利用することができます。0無効な文字列が指定された場合、(追加情報なしで)返されます。

$isUTF8 = preg_match('//u', $string);

別の可能性はmb_check_encoding [PHPマニュアル]です:

$validUTF8 = mb_check_encoding($string, 'UTF-8');

使用できるもう1つの関数はmb_detect_encoding [PHPマニュアル]です。

$validUTF8 = ! (false === mb_detect_encoding($string, 'UTF-8', true));

strictパラメータをに設定することが重要trueです。

さらに、iconv [PHPマニュアル]を使用すると、無効なシーケンスをその場で変更/削除できます。(ただし、iconvこのようなシーケンスが発生した場合は、通知が生成されます。この動作は変更できません。)

echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $string), PHP_EOL;

@戻り文字列の長さを使用して確認できます。

strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string));

iconvマニュアルページの例も確認してください。

于 2011-07-17T11:41:20.867 に答える
0

UTF-8で無効な文字の仕様はかなり明確です。おそらく、解析を試みる前にそれらを取り除きたいと思うでしょう。それらはそこにあるべきではないので、XMLを生成する前でもそれを回避できれば、さらに良いでしょう。

参考のためにここを参照してください:

http://www.w3.org/TR/xml/#charsets

それは完全なリストではありません。多くのパーサーは、いくつかの低い番号の制御文字も許可していませんが、現在、包括的なリストを見つけることができません。

ただし、iconvにはこれに対する組み込みのサポートがある可能性があります。

http://www.zeitoun.net/articles/clear-invalid-utf8/start

于 2011-07-17T11:40:46.203 に答える
0

mb_detect_encoding(UTF-8とは異なる)文字セットがあるかどうかを検出し、mb_convert_encoding必要に応じてUTF-8に変換するためにを使用してみてください。無効なUTF-8を提供するよりも、別の文字セットで有効なコンテンツを提供している可能性が高くなります。

于 2011-07-17T11:41:12.620 に答える
0

iconv @()の前にinを配置して、NOTICEを抑制し、ソースエンコーディングIDのUTF-8の後に// IGNOREを配置して、無効な文字を無視します。

@iconv('UTF-8//IGNORE', $destinationEncoding, $yourString);
于 2011-07-17T11:51:42.897 に答える