繁体   English   中英

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

[英]iconv - Detected an illegal character in input string

我没有看到任何违法行为 - 关于可能是什么问题的任何建议?

    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 行

但是,如果您使用了已接受的答案,如果您的输入字符串中的某个字符无法音译,您仍会收到 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

所以你应该使用 IGNORE,它会忽略不能音译的内容:

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

非法字符不在$matches[1] ,而是在$xml

尝试

iconv($matches[1], 'utf-8//TRANSLIT', $xml);

向我们展示输入字符串将有助于获得更好的答案。

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

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

例如,我使用 utf8mb4 从 MySQL获取一个字符串(现在很常见来编码表情符号):

$formattedString = strtolower($stringFromMysql);
$strCleaned = iconv('UTF-8', 'utf-8//TRANSLIT', $formattedString); // WILL RETURN THE ERROR 'Detected an illegal character in input string'

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

合适的方法是使用多字节字符串函数mb_strtolower()而不是strtolower()

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

更多信息

这个问题的更多例子可以在这个SO 答案中找到

多字节字符串的PHP 手册

PHP 7.2

iconv('UTF-8', 'ASCII//TRANSLIT', 'é@ùµ$`à');
// "e@uu$`a"

iconv('UTF-8', 'ASCII//IGNORE', 'é@ùµ$`à');
// "@$`"

iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'é@ùµ$`à');
// "e@uu$`a"

PHP 7.4

iconv('UTF-8', 'ASCII//TRANSLIT', 'é@ùµ$`à');
// PHP Notice:  iconv(): Detected an illegal character

iconv('UTF-8', 'ASCII//IGNORE', 'é@ùµ$`à');
// "@$`"

iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', 'é@ùµ$`à');
// "e@u$`a"

iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', Transliterator::create('Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC')->transliterate('é@ùµ$`à'))
// "e@uu$`a" -> same as PHP 7.2

我找到了一个解决方案:

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

使用 utf8_encode()

这个波纹管解决方案对我有用

$result_encr="##Sƒ";

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM