IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Erreur de conversion de charset [Encodage]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Par défaut Erreur de conversion de charset
    Bonjour,

    j'ai des données en base saisies par des éditeurs (souvent copiées collées depuis des sources aux formats divers), encodées en UTF-8, que je dois régulièrement basculer en front office pour publication par notre CMS. L'intégralité du Front Office étant en Latin1, je vérifie la compatibilité du contenu, et s'il est incompatible je transforme au plus près avec la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $repairedSubject = iconv("ISO-8859-1", "UTF-8", iconv("UTF-8", "ISO-8859-1//TRANSLIT", $subject));
    Jusque là ça roulait, ce code est en place depuis plus d'un an sans accroc. Mais voilà que de nouveaux éditeurs, qui me font des copier coller depuis des docx, font péter le système. Les données comme de simples accents, qui semblent tout à fait corrects, me sortent des "?" à tout va.

    Un exemple :
    Source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La France est un grand pays et son système de gestion des crises sanitaires est un des meilleurs du monde.
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La France est un grand pays et son syste?me de gestion des crises sanitaires est un des meilleurs du monde.
    Si quelqu'un a une idée, ou une meilleure technique à tester, ce serait très sympa de m'en faire profiter.
    Bye

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Par défaut
    Après quelques essais, le caractère "è" ici présent, est en fait encodé en UTF-8 en 65 CC 80 au lieu de C3 A8 comme on pourrait s'y attendre.

    D'après mes recherches, ça correspond à "LATIN SMALL LETTER E (unicode 0065, UTF8 : 65) + COMBINING GRAVE ACCENT (unicode 0300, UTF8 : cc 80)".

    Il semblerait que ce soit le Mac OS qui générerait ça, ok moi pas raciste, mais pourquoi si c'est un caractère UTF-8 valide iconv ne le convertit pas ? Quelqu'un sait si c'est une séquence correcte en UTF-8 ?

    Merci d'avance

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    les trucs windows c'est pas du ISO-8859-1 mais du Windows-1252

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Pour récupérer é au lieu de e + accent, il suffit d'appliquer une composition canonique (NFC) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /* UTF-8 */ $out = normalizer_normalize(/* UTF-8 */ $in, Normalizer::FORM_C);
    Les deux (é comme e + accent) sont parfaitement valides et équivalents. Par contre, l'accent seul n'est pas retranscriptible en ISO-8859-1 (et similaire), par défaut (sans //TRANSLIT et/ou //IGNORE) et le résultat d'iconv dépend de son implémentation (glibc vs libiconv/bsd).

    CP1252 n'est qu'une extension de ISO-8859-1 (des caractères de contrôle sont remplacés par des imprimables). Le é, par exemple, possède le même point de code (également commun avec Unicode - 0xE9).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Par défaut
    Merci bien pour vos réponses.

    Effectivement, le CP-1252 ne correspond pas à mon problème.

    Je vais tester illico ta solution julp, je ne connaissais pas du tout Normalizer, tout ça m'a l'air très intéressant.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Par défaut
    Bon ben ça m'a l'air de fonctionner au poil, un grand merci à toi julp.

    Je continue à encapsuler tout ça dans un aller-retour vers du Latin1 avec iconv//translit pour assurer la compatiblité ISO-8859-1 et ça devrait rouler.

    Une bonne journée à vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de conversion
    Par HULK dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/09/2005, 11h14
  2. Erreur de conversion
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/08/2005, 16h23
  3. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  4. Erreur de conversion de type Null en String
    Par navis84 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/07/2005, 15h25
  5. Erreur de conversion int to socklen_t
    Par def_jam_vendetta dans le forum C++
    Réponses: 6
    Dernier message: 04/03/2005, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo