Php iconv-在输入字符串中检测到非法字符

Php iconv-在输入字符串中检测到非法字符,php,iconv,Php,Iconv,我看不到任何违法的事情——有没有关于问题所在的建议 if (strtolower($matches[1]) != 'utf-8') { var_dump($matches[1]); $xml = iconv($matches[1], 'utf-8', $xml); $xml = str_replace('encoding="'.$matches[1].'"', 'encoding="utf-8"', $xml); } 下面是我的调

我看不到任何违法的事情——有没有关于问题所在的建议

    if (strtolower($matches[1]) != 'utf-8') {
        var_dump($matches[1]);
        $xml = iconv($matches[1], 'utf-8', $xml);
        $xml = str_replace('encoding="'.$matches[1].'"', 'encoding="utf-8"', $xml);
    }
下面是我的调试/错误

string(12) "windows-1252"
Notice (8): iconv() [http://php.net/function.iconv]: Detected an illegal character in input string [APP/models/sob_form.php, line 16]

我已经验证了上面的代码确实是第16行,非法字符不在
$matches[1]
中,而是在
$xml

试一试


显示输入字符串可以获得更好的答案。

但是,如果您使用了接受的答案,如果您的输入字符串中的某个字符无法进行音译,您仍然会收到PHP通知:

<?php
$cp1252 = '';

for ($i = 128; $i < 256; $i++) {
    $cp1252 .= chr($i);
}

echo iconv("cp1252", "utf-8//TRANSLIT", $cp1252);

PHP Notice:  iconv(): Detected an illegal character in input string in CP1252.php on line 8

Notice: iconv(): Detected an illegal character in input string in CP1252.php on line 8
echo iconv("cp1252", "utf-8//IGNORE", $cp1252);
我找到了一个解决方案:

echo iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($string));

使用utf8_encode()

要非常小心,问题可能来自多字节编码和使用了不适当的PHP函数

这是我的情况,我花了一段时间才弄明白

例如,我使用utf8mb4从MySQL获取a字符串(现在对emojis进行编码非常常见):

问题不存在于
iconv()
中,而存在于
strtolower()
在这种情况下

适当的方法是使用多字节字符串函数,而不是使用多字节字符串函数

$formattedString = mb_strtolower($stringFromMysql);
$strCleaned = iconv('UTF-8', 'utf-8//TRANSLIT', $formattedString); // WORK FINE

更多信息 有关此问题的更多示例,请访问本网站

PHP 7.2上的PHP手册
iconv('UTF-8','ASCII//TRANSLIT','é@ùµ$`a');
// "e@uu$`a“
iconv('UTF-8','ASCII//IGNORE','é@ùµ$'a');
// "@$`"
iconv('UTF-8','ASCII//TRANSLIT//IGNORE','é@ùµ$'a');
// "e@uu$`a“
PHP7.4
iconv('UTF-8','ASCII//TRANSLIT','é@ùµ$`a');
//PHP注意事项:iconv():检测到非法字符
iconv('UTF-8','ASCII//IGNORE','é@ùµ$'a');
// "@$`"
iconv('UTF-8','ASCII//TRANSLIT//IGNORE','é@ùµ$'a');
// "e@u$`a“
iconv('UTF-8','ASCII//translatit//IGNORE',transiterator::create('Any-Latin;NFD;[:非空格标记:]Remove;NFC')->音译('é@µ$`a'))
// "e@uu$`a“->与PHP7.2相同

下面这个解决方案对我很有效

$result_encr="##Sƒ";

iconv("cp1252", "utf-8//IGNORE", $result_encr);

即使我把“//IGNORE”放在两边,我也会收到同样的通知。你说两边都是什么意思?还有@Erlesegal Halevi,我想看看你的代码。@Mantas,但Erel在回答我的答案中的
//IGNORE
文本,这就是为什么我对你对他的赞扬感到困惑的原因。那是很久以前的事了,但根据我的记忆,我的代码类似于:echo iconv(“cp1252//IGNORE”,“utf-8//IGNORE”,“cp1252美元”);即使我在两边都加上“//TRANSLIT”,我也会收到同样的通知instead@2astalavista这是值得写在这里作为一个答案。^^^^这(ASCII//TRANSLIT//IGNORE)正是我所需要的。谢谢
$formattedString = mb_strtolower($stringFromMysql);
$strCleaned = iconv('UTF-8', 'utf-8//TRANSLIT', $formattedString); // WORK FINE
$result_encr="##Sƒ";

iconv("cp1252", "utf-8//IGNORE", $result_encr);