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

22
demandé sur Webnet 2012-01-04 17:32:08

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.

22
répondu Ranty 2012-01-04 13:37:58

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);
27
répondu NobleUplift 2013-10-25 17:21:20

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 dans strtolower() 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

2
répondu micaball 2018-01-19 16:42:38

J'ai trouvé une Solution :

echo iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($string));

Utiliser utf8_encode()

0
répondu Irshad Khan 2017-07-24 13:52:39