Я не вижу ничего противозаконного - есть предположения, в чем может быть проблема?
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);
Будьте очень осторожны,, проблема может исходить от multibytes кодирование и неадекватные функции PHP, используемые...
Это было для меня и мне потребовалось некоторое время, чтобы выяснить это.
Например, я получаю в строки из MySQL с помощью utf8mb4 (очень распространенная сейчас кодировать смайлы):
$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
<Н2>подробнее</Н2> Больше примеров этой проблемы в ответь
Руководство по PHP на многобайтовые строки
Я нашел одно решение:
echo iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($string));
используйте utf8_encode()