iconv - Détecté un caractère illégal dans la chaîne d'entrée
Je ne vois rien d'illégal - des suggestions sur ce qui pourrait être le problème?
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);
}
Ci-dessous est mon débogage / erreur
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]
J'ai vérifié que le code ci-dessus est bien la ligne 16
4 réponses
Le caractère illégal n'est pas dans $matches[1]
, mais $xml
Essayez
iconv($matches[1], 'utf-8//TRANSLIT', $xml);
Et nous montrer la chaîne d'entrée serait bien pour une meilleure réponse.
Si vous avez utilisé la réponse acceptée, cependant, vous recevrez toujours L'avis PHP si un caractère dans votre chaîne d'entrée ne peut pas être translittéré:
<?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
Donc, vous devriez utiliser IGNORE, qui ignorera ce qui ne peut pas être translittéré:
echo iconv("cp1252", "utf-8//IGNORE", $cp1252);
Soyez très prudent , le problème peut provenir de encodage multi-octets et des fonctions PHP inappropriées utilisées...
C'était le cas pour moi et il m'a fallu un certain temps pour comprendre.
Par exemple, je reçois la chaîne a de MySQL en utilisant utf8mb4 (très courant maintenant pour encoder des emojis):
$formattedString = strtolower($stringFromMysql);
$strCleaned = iconv('UTF-8', 'utf-8//TRANSLIT', $formattedString); // WILL RETURN THE ERROR 'Detected an illegal character in input string'
Le problème ne se trouve pas dans
iconv()
mais dansstrtolower()
dans ce cas.
La manière appropriée est d'utiliser chaîne multi-octets Fonctions mb_strtolower()
au lieu de strtolower()
$formattedString = mb_strtolower($stringFromMysql);
$strCleaned = iconv('UTF-8', 'utf-8//TRANSLIT', $formattedString); // WORK FINE
PLUS D'INFOS
D'autres exemples de ce problème sont disponibles à cette donc répondre
Manuel PHP sur la chaîne multi-octets
J'ai trouvé une Solution :
echo iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($string));
Utiliser utf8_encode()