2010-09-02 4 views
2

Je suis en train de convertir une chaîne de iso-8859-1 à utf-8. Mais quand je trouve ces deux charachter € et • la fonction renvoie un caractère qui est un carré avec deux nombre à l'intérieur.Fonction PHP iconv encodage de caractères de iso-8859-1 à utf-8

Comment puis-je résoudre ce problème?

+1

S'il vous plaît montrer quelques données de code et d'exemple. –

+1

Les deux caractères '' 'et' 'ne sont pas contenus dans [ISO 8859-1] (http://en.wikipedia.org/wiki/ISO/IEC_8859-1). Alors quel encodage utilisez-vous? – Gumbo

Répondre

8

Je pense que l'encodage que vous recherchez est Windows code page 1252 (Europe occidentale). Ce n'est pas la même chose que ISO-8859-1 (ou 8859-15 d'ailleurs); les caractères de la plage 0xA0-0xFF correspondent à 8859-1, mais cp1252 ajoute un assortiment de caractères supplémentaires dans la plage 0x80-0x9F où ISO-8859-1 attribue des codes de contrôle peu utilisés.

La confusion vient du fait que lorsque vous servez une page text/html;charset=iso-8859-1, pour des raisons historiques, les navigateurs en fait utilisation CP1252 (et par conséquent de soumettre des formulaires à CP1252 aussi).

iconv('cp1252', 'utf-8', "\x80 and \x95") 
-> "\xe2\x82\xac and \xe2\x80\xa2" 
+0

Merci bobince! Maintenant ça marche. Je veux vous poser une autre question maintenant. Comment puis-je vérifier tous les sites qui sont des ensembles en texte/html; charset = iso-8859-1 est vraiment dans cp1252? (Comment avez-vous expliqué dans la réponse). – albertopriore

+0

Si vous voyez un octet dans la plage 0x80-0x9F, vous regardez certainement cp1252 plutôt que 8859-1, puisque les 'codes de contrôle C1' sont très rarement utilisés (presque jamais, sur le web). Si la source de la chaîne "ISO-8859-1" est basée sur le Web, cela signifie presque certainement que c'est vraiment cp1252, puisque c'est ce que les navigateurs utilisent. – bobince

+0

J'ai essayé de le faire -> mb_detect_encoding ($ string, 'cp1252'); puis avec la même chaîne mb_detect_encoding ($ string, 'ISO-8859-1'); le premier me renvoie 'faux' le second me renvoie que c'est une chaîne ISO-8859-1. Mais ce n'est pas le cas. Comment puis-je effectuer une vérification de charset? – albertopriore

0

iso-8859-1 ne contient pas le signe €, donc votre chaîne ne peut pas être interprétée avec iso-8859-1 si elle le contient. Utilisez plutôt iso-8859-15.

+0

Alors qu'en est-il du •? C'est [Windows-1252] (https://en.wikipedia.org/wiki/Windows-1252#Code_page_layout), pas [ISO-8859-15] (https://en.wikipedia.org/wiki/ISO/IEC_8859 -15 # Codepage_layout). – NobleUplift

0

Les 2 caractères sont illégaux dans iso-8859-1 (avez-vous dire iso-8859-15?)

$ php -r 'echo iconv("utf-8","iso-8859-1//TRANSLIT","ter € and • the");' 
ter EUR and o the 
+0

[ISO-8859-15] (https://en.wikipedia.org/wiki/ISO/IEC_8859-15#Codepage_layout) n'a pas de point de code pour •. Il doit s'agir de [Windows-1252] (https://en.wikipedia.org/wiki/Windows-1252#Code_page_layout). – NobleUplift

+0

Très probablement oui, _'has to'_ est un mot un peu fort (il y a plusieurs caractères qui ont à la fois € et •). La solution 'iconv' reste la même tant que les gens connaissent leur charset d'entrée. – Wrikken

+0

Bon point! Ensuite, je me rabat sur mon affirmation précédente selon laquelle ISO-8859-1 n'a pas de balle. – NobleUplift

1

Vérifiez toujours votre encodage en premier! Vous ne devriez jamais faire confiance aveuglément à votre encodage (même si c'est à partir de votre propre site Web!):

function convert_cp1252_to_utf8($input, $default = '') { 
    if ($input === null || $input == '') { 
     return $default; 
    } 

    // https://en.wikipedia.org/wiki/UTF-8 
    // https://en.wikipedia.org/wiki/ISO/IEC_8859-1 
    // https://en.wikipedia.org/wiki/Windows-1252 
    // http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT 
    $encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true); 
    if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') { 
     /* 
     * Because ISO-8859-1 and CP1252 are identical except for 0x80 through 0x9F 
     * and control characters, always convert from Windows-1252 to UTF-8. 
     */ 
     $input = iconv('Windows-1252', 'UTF-8//IGNORE', $input); 
    } 
    return $input; 
} 
Questions connexes