【问题标题】:iconv - Detected an illegal character in input stringiconv - 在输入字符串中检测到非法字符
【发布时间】:2012-02-02 09:44:16
【问题描述】:

我没有发现任何违法行为 - 对可能存在的问题有何建议?

    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行

【问题讨论】:

  • @2astalavista 值得在这里写下作为答案。

标签: php iconv


【解决方案1】:

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

【讨论】:

  • 即使我在两边都加上“//IGNORE”,我也会收到同样的通知
  • 两边是什么意思?
  • 还有@ErelSegal-Halevi,我想看看你的代码。
  • @Mantas 但是 Erel 在我的回答中回复了//IGNORE 文字,这就是为什么我对你对他的赞美感到困惑。
  • 那是很久以前的事了,但据我记忆,我的代码是这样的: echo iconv("cp1252//IGNORE", "utf-8//IGNORE", $cp1252);
【解决方案2】:

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

试试

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

向我们展示输入字符串会得到更好的答案。

【讨论】:

  • 即使我在两边都加上“//TRANSLIT”,我也会收到同样的通知
  • 改用//IGNORE
【解决方案3】:

要非常小心,问题可能来自多字节编码和使用了不适当的 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 answer 上提供了有关此问题的更多示例

PHP 手册上Multibyte String

【讨论】:

    【解决方案4】:

    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
    

    【讨论】:

    • ^^^this (ASCII//TRANSLIT//IGNORE) 正是我所需要的。谢谢
    【解决方案5】:

    我找到了一个解决方案:

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

    使用 utf8_encode()

    【讨论】:

      【解决方案6】:

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

      $result_encr="##Sƒ";
      
      iconv("cp1252", "utf-8//IGNORE", $result_encr);
      

      【讨论】:

        【解决方案7】:

        我在使用 Notepad++ 生成的 ASCII 格式的“é”字符的文件中遇到了同样的错误

        $row_tmp[$index]=iconv("ASCII", "UTF-8//TRANSLIT",$value);
        

        使用

        $row_tmp[$index]=iconv("ISO-8859-1", "UTF-8//TRANSLIT",$value);
        

        ...似乎可以解决它(使用具有比利时语言环境的 Windows 计算机)。 iconv 显然需要源编码的 ASCII 扩展名的确切代码。 mb_detect_encoding 为同一文件返回“ASCII”,因此如果源编码参数来自变量,请小心...

        【讨论】:

          猜你喜欢
          • 2014-08-16
          • 2012-08-08
          • 1970-01-01
          • 1970-01-01
          • 2016-06-19
          • 1970-01-01
          • 2021-05-09
          • 2017-05-13
          • 1970-01-01
          相关资源
          最近更新 更多