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 :

Migrer un site PHP / MySql ISO-8859-1 vers UTF-8


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut Migrer un site PHP / MySql ISO-8859-1 vers UTF-8
    Bonjour,

    Migrer un site PHP / MySql ISO-8859-1 vers UTF-8

    Il me semble qu'il y avait un tito à ce sujet, je n'arrive pas à le retrouver.

    De mémoire, sachant que le site en PHP 7.2 est par défaut codé en UTF-8

    1) Recoder tous les scripts d'ANSI vers YTF-8 sans DOM avec Notepad++.

    2) Indiquer UTF-8 à toutes les fonctions pour lesquelles il faut spécifier un jeu de caractères : html_entities () par exemple.

    3) passer en mb pour certaines fonctions de chaînes : strlen, strpos.

    4) Coder les champs textes de le BD en UTF-8.

    Un gros boulot.

    N'ai-je rien oublié ?

    Lien vers le Tuto ou une bonne discussion ?

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Dernière modification par Invité ; 01/07/2018 à 14h13.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Merci pour tes liens.

    L'emploi d'UTF-8 oblige-t-il à ajouter mb_ devant toutes les fonctions de chaînes ?

    La question n'est pas soulevée dans le tuto sur la migration.

  4. #4

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Je suis sous PHP 7.2, donc pare défaut en UTF-8.

    Actuellement le passage en iso-8859-1 se fait de la façon suivante :

    Dans les scripts PHP primaires :

    header ('content-type: text/html; charset=iso-8859-1');

    Et dans les pages html :

    <meta charset="ISO-8859-1" />

    Et cela marche très bien, sauf que le validateur du W3C me dit que c'est une erreur d'être en ISO-8859-1.

    Pour préparer le passage en UTF-8, je fais le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
     
    header ('content-type: text/html; charset=utf-8');
     
    $str = 'aèô';
     
    $ct = strlen ($str);
     
    $ps = strpos ($str, 'ô');
     
    echo '<!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="utf-8" />
    <title>Essai UTF-8</title>
    </head>
    <body>
    <p>';
     
    echo mb_detect_encoding($str);
    echo '<br>';
    echo $str;
    echo '<br>';
    echo $ct;
    echo '<br>';
    echo $ps;
     
    echo '</p>
    </body>
    </html>';
     
    ?>
    Ce qui sort :

    UTF-8
    a��
    3
    2

    Je ne comprends pas pourquoi è et ô sont mal affichés alors que je suis en UTF-8.

    Si je repasse en iso-8859-1 j'obtiens :

    UTF-8
    aèô
    3
    2

    Et je ne comprends pas pourquoi mb_detect_encoding($str) retourne UTF-8 alors que je suis en iso-8859-1...

    Pouvez-vous m'aider ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    J'avais oublé d'enregistrer le script en UTF-8, il était en ANSI.

    Après UTF 8 cela donne :

    UTF-8
    aéô
    5
    3

    Il faut donc utiliser mb_strlen et mb_strpos.

    UTF-8
    aéô
    3
    2

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Accessoirement je fais la chasse aux caractères accentués non transformés en entités html dans ma base.

    col_1 est encodé latin1_swedish_ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM ma_table
    WHERE col_1 LIKE _latin1 '%é%'
    COLLATE latin1_swedish_ci
    Ne retourne rien alors quau moins une ligne est connue avec é

    Savez-vous où est l'erreur ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    il faudrait savoir...
    Tu transformes tout en UTF-8, ou tout en latin ???

    De plus, les lettres accentuées doivent rester telles-quelles dans la base de données !
    On ne les transforme pas en entités HTML. Ca n'a aucun sens.

    Ce n'est qu'au moment de l'affichage qu'on utilise htmlspecialchars.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Pour l'instant je suis encore en latin1_swedish_ci dans la BD.

    C'est après avoir mis en ligne les programmes recodé en UTF-8 que je passe la BD en UTF-8, c'est logique.

    J'utilise des entités html dans la base de données, c'est une sécurité simple contre les inclusions SQL et je ne vois pas où est le problème.

    Autre avantage les caractère accentués seront bien affichés pendant la bascule, quand mes programmes seront en UTF-8 et la BD en ISO.

    J'essaye de traquer les quelques caractères accentués qui restent par erreur avant de migrer en UTF-8, d'où ma question sur la requête nécessaire.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Il faut laisser les caractères accentués en BDD.
    Renseigne-toi.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Je veux bien me renseigner, as-tu une piste ?

    Autrement j'ai trouvé une requête qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM  ma_table 
    WHERE col_1
    COLLATE latin1_bin LIKE  '%é%'

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Autre petit problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    number_format ($float, 2, ',', chr(0xA0));
    A la place de l'espace insécable j'ai une daube.

    Mais le script primaire n'est pas encore enregistré en UTF-8, ceci explique sans doute cela.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    J'ai trouvé ce codage qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $float = number_format ($float, 2, ',', "\xC2\xA0");

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par boteha Voir le message
    J'utilise des entités html dans la base de données, c'est une sécurité simple contre les inclusions SQL et je ne vois pas où est le problème.
    Autre avantage les caractère accentués seront bien affichés pendant la bascule, quand mes programmes seront en UTF-8 et la BD en ISO.
    Y a 10 ans de ça, j'avais vu de petits jeunes tenir des conférences sur cette approche : ils avaient appelé leur astuce "la sécurité profonde" !
    Très drôle ! Dès que tu procède ainsi, tu rends tout très vite très compliqué.

    Je vais te parler d'une expérience chez un client qui avait eu deux dev adeptes de cette ineptie.
    Quand il a fallu mettre en place un outil tiers pour générer des stats à partir de la base de données, ils se sont rendus compte que cet outil ("merdique", d'après eux) ne comprenait pas les échappements HTML effectués avec htmlentities(). Ben, j'avais essayé de leur faire comprendre que stocker un affichage HTML en base n'avait aucun sens ; en vain !

    Ensuite, le client avait décidé d'utiliser un moteur de rendu tiers pour générer les pages : comme tout bon moteur, les échappements étaient automatiques et je te donne en mille ce qui sortait sur la page : les valeurs avec les codes de remplacement des caractères accentués ! Ben ouais, en base on avait les entités donc une fois échappées on voyait :

    Il &amp;eacute;tait une fois deux d&amp;eacute;veloppeurs ayant laiss&amp;eacute; de c&amp;ocirc;t&amp;eacute; le bon sens le plus &amp;eacute;l&amp;eacute;mentaire
    Bonjour, le bordel et le travail de reprise !

    En conclusion :
    ON ENREGISTRE TOUJOURS EN BASE DE DONNÉES LES VALEURS BRUTS, SANS TRANSFORMATION NI ÉCHAPPEMENT

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    En conclusion :
    ON ENREGISTRE TOUJOURS EN BASE DE DONNÉES LES VALEURS BRUTS, SANS TRANSFORMATION NI ÉCHAPPEMENT
    +1. CQFD.


    Oups ! Je viens de capter une autre ineptie :
    Citation Envoyé par boteha Voir le message
    ..., quand mes programmes seront en UTF-8 et la BD en ISO...
    Comment peut-on encore te faire comprendre que TOUT doit être un UTF-8 ??

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Merci de ton suivi.

    Citation Envoyé par jreaux62 Voir le message
    Comment peut-on encore te faire comprendre que TOUT doit être un UTF-8 ??
    J'ai compris.

    Je veux juste dire que quand je chargerai mes scripts en UTF-8 l'affichage sera bon alors que ma BD sera encore en ISO.

    Et je passera ensuite tranquillement la BD en UTF-8.

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    J'ai découvert la fonction PHP :

    mysqli_set_charset ($link, "utf8");

    Sachant que par défaut le codage est UTF-8 en PHP 7.2, dois-je l'utiliser ?

    Si oui c'est encore un gros boulot de mise à jour des scripts.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Ça t'arrive de LIRE les tutos qu'on te donne en lien ???

    *
    N.B Ça fait plus de 3 semaines....
    C'est sûr : tu prends ton temps.
    Pas sûr que tu fasses ce qu'il faut.

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Je prends mon temps parce-qu'il y a du boulot.

    Je te donne une bonne nouvelle.

    J'ai un script de connexion à la base utilisé par tous les programmes, en substance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Connexion ($Nom, $MotPasse, $Base, $Serveur)
    {
    $connexion = mysqli_connect ($Serveur, $Nom, $MotPasse, $Base);
     
    // j'ai ajouté :
    mysqli_set_charset ($connexion, "utf8");
     
    return $connexion;
    }
    Et tout marche bien alors que ma base est toujours en ISO.
    J'appelle cela une bonne surprise.

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    J'ai fait presque toutes les modifications nécessaires et cela semble bien marcher sur le site de test.

    Seul problème, les PDF édités avec la classe fpdf sont foireux.

    J'utilise la dernière version, il est vrai un peu ancienne.

    J'espère que le problème est documenté quelque part, je vais chercher.

Discussions similaires

  1. Conversion ISO-8859-1 vers UTF-8
    Par wd_newbie dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/03/2015, 12h45
  2. Problème migration iso-8859-1 vers utf-8
    Par Loki13 dans le forum ASP
    Réponses: 9
    Dernier message: 20/07/2011, 09h24
  3. Conversion ISO-8859-1 vers UTF-8 dans Eclipse
    Par Jerhom dans le forum Eclipse
    Réponses: 2
    Dernier message: 03/06/2008, 17h35
  4. Réponses: 1
    Dernier message: 05/12/2006, 16h54
  5. conversion iso-8859-1 vers utf-8
    Par gorgonite dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/08/2006, 12h49

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