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

时间:2012-01-04 13:32:08

标签: 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);
    }

以下是我的调试/错误

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行

6 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:27)

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

尝试

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

向我们展示输入字符串对于更好的答案会很好。

答案 2 :(得分:4)

非常小心,问题可能来自多字节编码,并且使用了不合适的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

提供了此问题的更多示例

Multibyte String

上的PHP手册

答案 3 :(得分: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

答案 4 :(得分:0)

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

from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'https://www.pro-football-reference.com/years/2020/draft.htm'
html = urlopen(url)
soup = BeautifulSoup(html, "lxml")
table = soup.find('div', class_='table_outer_container')

答案 5 :(得分:-1)

我找到了一个解决方案:

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

使用utf8_encode()