iconv UTF-8 // IGNORE仍会产生“非法字符”错误

时间:2012-02-21 10:29:20

标签: php utf-8 iconv

$string = iconv("UTF-8", "UTF-8//IGNORE", $string);

我认为此代码会删除无效的UTF-8字符,但会生成[E_NOTICE] "iconv(): Detected an illegal character in input string"。我错过了什么,如何从非法字符中正确地删除字符串?

4 个答案:

答案 0 :(得分:5)

输出字符集(第二个参数)应与输入字符集(第一个参数)不同。如果它们相同,那么如果字符串中存在非法的UTF-8字符,iconv将根据输入的字符集拒绝它们为非法。

答案 1 :(得分:0)

我知道2种方法来修复包含非法字符的UTF-8字符串:

  1. 非法字符将由问号(“?”)代替:

$message = mb_convert_encoding($message, 'UTF-8', 'UTF-8');

  1. 非法字符将被删除L

$message = iconv('UTF-8', 'UTF-8//IGNORE', $message);

实际上描述了第二种方法。但就我而言,它不会产生任何E_NOTICE。我使用error_reporting(E_ALL);对不同的损坏的UTF-8字符串进行了测试,结果始终如预期。自2012年以来,可能有所更改。我在PHP 7.2.9 Win上进行了测试。

答案 2 :(得分:0)

我正在使用带有波纹管设置的 mb_convert_encoding 删除无效字符

ini_set('mbstring.substitute_character', "none");
$string= mb_convert_encoding($string, 'UTF-8', 'UTF-8');

它在我的情况下有效。早些时候我收到了以下通知

<块引用>

注意:iconv():字符集错误,不允许从 UTF-8' to UTF-8//IGNORE' 转换

$string= iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string)

答案 3 :(得分:-1)

要简单地忽略通知,您可以使用&#34; @&#34;:

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