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

Ответы

Ответ 1

Нелегальный символ не находится в $matches[1], но в $xml

Try

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

И показывая нам, что строка ввода будет приятной для лучшего ответа.

Ответ 2

Если вы использовали принятый ответ, вы все равно получите уведомление 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);

Ответ 3

Я нашел одно решение:

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

использовать utf8_encode()

Ответ 4

ОЧЕНЬ ОСТОРОЖНО, проблема может возникнуть в кодировании с несколькими байтами и используются ненадлежащие функции PHP...

Это было для меня, и мне потребовалось некоторое время, чтобы понять это.

Например, я получаю строку из MySQL, используя utf8mb4 (очень часто для кодирования emojis):

$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 на Многобайтная строка