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