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);
}
Voici 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
Le caractère illégal n'est pas dans $matches[1]
, mais en $xml
Essayer
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 le PHP Remarque 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
Vous devez donc 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 codage multi-octets et inapproprié = PHP fonctions utilisées ...
C'était le cas pour moi et il m'a fallu un certain temps pour le comprendre.
Par exemple, j'obtiens la chaîne a de MySQL en utilisant utf8mb4 (très courant maintenant pour encoder les 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 se trouve dansstrtolower()
dans ce cas.
La manière appropriée consiste à utiliser les fonctions de chaîne multi-octets mb_strtolower()
au lieu de strtolower()
$formattedString = mb_strtolower($stringFromMysql);
$strCleaned = iconv('UTF-8', 'utf-8//TRANSLIT', $formattedString); // WORK FINE
Plus d'exemples de ce problème sont disponibles ici réponse SO
Manuel PHP sur Chaîne multi-octets
J'ai trouvé une solution:
echo iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($string));
utilisez utf8_encode ()