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 :

Encodage UTF8 bizarre


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Encodage UTF8 bizarre
    Bonjour à tous,

    Je lutte depuis des heures pour résoudre un problème d'encodage de caractères. J'espère trouver ici un peu de réconfort...
    Je dois transformer un très gros fichier ODS (Tableur LibreOffice) en une interface web + MySQL. Pour cela j'ai importé directement le tableau dans PHPMyAdmin (sans problème). Tous les champs sont des chaines de caractères.

    Visuellement toutes les données s'affichent correctement dans une page UTF-8. Mais j'ai remarqué énormément de caractères spéciaux qui ne me semblent pas "conforme" car non capturés par une fonction preg_replace_callback()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    echo preg_replace_callback(
            '/([çñÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðòóôõöùúûüµýÿ])/u',
            function ($matches) {
    		return '<span style="background-color:#ffff66;font-size:1.2em;border:1px solid black">'.$matches[0].'</span>';
            },
            $str
        );
    Après un long moment, j'ai constaté que certains caractères n'étaient pas encodés de la même manière comme par exemple : "é"
    1/ capturé par preg_replace_callback() : c3a9 en héxa
    2/ non capturé par preg_replace_callback() : 65cc81 en héxa !
    J'ai remarqué également qu'un copié/collé du caractère bizarre dans NotePad++, celui s'affiche : ""

    Comment puis-je m'y prendre pour "purifier" chaque cellule du tableau (fichier ODS) avant de l'importer dans MySQL ?
    sauf si la solution se trouve dans LibreOffice (mais pas trouvé).
    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 439
    Points : 15 813
    Points
    15 813
    Par défaut
    Citation Envoyé par Tchupacabra Voir le message
    2/ non capturé par preg_replace_callback() : 65cc81 en héxa !
    ceci n'est pas le caractère "e avec accent" même si ça y ressemble. le "65" c'est le "e" et "cc81" est le caractère " ́ combiné" en UTF-8 (http://www.utf8-chartable.de/unicode...e.pl?start=768).

    tu devrais chercher d'où vient ce caractère avant d'arriver dans le fichier tableur puisque je pense qu'il n'est pas produit en appuyant sur la touche "é".

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    C'est du copié/collé de page Web dans LibreOffice à partir d'un Mac... rien que ça !

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Tu dois effectuer une normalisation NFC de ta chaîne. C'est une opération qui consiste à décomposer tous les caractères accentués de la chaîne (le NFD) pour ensuite les recomposer dans leur forme la plus courte.

    Plusieurs solutions s'offrent à toi, la meilleur étant selon moi d'utiliser Normalizer::normalize() qui est livrée avec l'extension intl qu'il faudra alors installer si ce n'est déjà fait. Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = Normalizer::normalize($str);
    Sinon, si tu ne peux pas installer intl, tu devras faire une table de conversion (un tableau associatif) avec chaque caractère accentué susceptible d'être dans ton document (la clef étant la forme combinée, la valeur étant la forme courte) puis d'utiliser strtr (c'est plutôt fastidieux). Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $trans = [ "e\xcc\x80" => "è",
               "e\xcc\x81" => "é", /* etc. */ ];
    $str = strtr($str, $trans);

  5. #5
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    UN MIRACLE !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = Normalizer::normalize($str);
    marche très bien.
    A présent tous les caractères spéciaux semblent capturés. Je vais pouvoir avancer maintenant.

    CosmoKnacki et mathieu

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

Discussions similaires

  1. [Encodage] utf8 image affichage
    Par oim dans le forum Langage
    Réponses: 7
    Dernier message: 05/04/2007, 15h24
  2. Pb encodage utf8
    Par rems14 dans le forum Outils
    Réponses: 1
    Dernier message: 18/02/2007, 20h47
  3. [Tableaux] Encodage utf8 d'un tableau
    Par lodan dans le forum Langage
    Réponses: 8
    Dernier message: 28/08/2006, 14h57
  4. Problème d'encodage UTF8
    Par vg33 dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2006, 20h28
  5. fonction native d'encodage utf8 ?
    Par Bruno2000 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/05/2006, 18h27

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