web-dev-qa-db-fra.com

iconv - Détection d'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);
    }

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

28
Webnet

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.

27
Ranty

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);
31
NobleUplift

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

Plus d'exemples de ce problème sont disponibles ici réponse SO

Manuel PHP sur Chaîne multi-octets

5
micaball

J'ai trouvé une solution:

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

utilisez utf8_encode ()

0
Irshad Khan