php - please - iconv-Detectó un carácter ilegal en la cadena de entrada
php iconv(): detected an illegal character in input string (4)
El carácter ilegal no está en $matches[1] , sino en $xml
Tratar
iconv($matches[1], ''utf-8//TRANSLIT'', $xml);
Y mostrarnos la cadena de entrada sería bueno para una mejor respuesta.
No veo nada ilegal, ¿alguna sugerencia sobre cuál podría ser el problema?
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);
}
Abajo esta mi debug / error
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]
He verificado que el código anterior es de hecho la línea 16.
Encontré una solución:
echo iconv(''UTF-8'', ''ASCII//TRANSLIT'', utf8_encode($string));
utilizar utf8_encode ()
Sin embargo, si usó la respuesta aceptada, seguirá recibiendo el Aviso de PHP si no se puede transliterar un carácter en la cadena de entrada:
<?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
Así que debes usar IGNORE, que ignorará lo que no se puede transliterar:
echo iconv("cp1252", "utf-8//IGNORE", $cp1252);
TENGA MUCHO CUIDADO , el problema puede provenir de la codificación multibytes y de las funciones inadecuadas de PHP utilizadas ...
Fue el caso para mí y me tomó un tiempo resolverlo.
Por ejemplo, obtengo una cadena de MySQL usando utf8mb4 (muy común ahora para codificar emojis):
$formattedString = strtolower($stringFromMysql);
$strCleaned = iconv(''UTF-8'', ''utf-8//TRANSLIT'', $formattedString); // WILL RETURN THE ERROR ''Detected an illegal character in input string''
El problema no está en
iconv()sino enstrtolower()en este caso.
La forma adecuada es utilizar las funciones de cadena mb_strtolower() lugar de strtolower()
$formattedString = mb_strtolower($stringFromMysql);
$strCleaned = iconv(''UTF-8'', ''utf-8//TRANSLIT'', $formattedString); // WORK FINE
MÁS INFORMACIÓN
Más ejemplos de este problema están disponibles en esta respuesta SO
Manual de PHP en la cadena multibyte