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

PHP & Base de données Discussion :

Php/MySQL et caractères cyrilliques [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut Php/MySQL et caractères cyrilliques
    Bonjour à tous,

    je développe actuellement une petite application en Php/MySQL dans une ex-république soviétique... et se pose donc la question de la gestion des caractères cyrilliques.

    Dans une table, certains champs sont donc en cyrillique, mais quand je les affiche via une requête SQL, je n'ai que des ???????? qui apparaissent.

    Je précise que j'ai également des caractères cyrilliques dans des labels codés en dur dans mon code php, mais ceux-ci apparaissent sans problème.

    D'où la question: que dois-je vérifier / changer pour que les caractères cyrilliques stockés dans la base apparaissent correctement?

    Quelques détails techniques:
    - Je développe en local avec EasyPhp 3.0 (Apache 2.2.11, PHP 5.2.8, PhpMyAdmin 3.1.1, MySQL 5.1.30)
    - Dans l'interface de PhpMyAdmin, les caractères apparaissent correctement
    - Toutes mes tables sont de type InnoDB et le collation est utf8_general_ci

    Une dernière précision, l'alphabet que j'utilise est en réalité un cyrillique légèrement modifié (tadjik), ce qui change peut-être la donne?

    Sûrement une question basique, mais je suis loin d'être un expert!

    Merci d'avance,

    Stéphane

  2. #2
    mon_nom_est_personne
    Invité(e)
    Par défaut
    Bienvenue dans le monde merveuilleux des encodage non ascii (et encore t'as de la chance car tu travaille sur du mono-octal).
    le secret est dans les SET NAMES
    En gros apres l'initialisation de ta requete tu dois specifier que ta bdd va recevoir du tadjik et que ce qui va en sortir est du tadjik. Toutfois une chose est interessante, depuis mysql 5 meme si ta page est encodee en utf8 tu doit ecrire SET NAMES UTF-8.
    donc la solution pour toi c'est D'executer la requete "SET NAMES nom_de_lencodage_de_ta_page"

  3. #3
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut


    Pour les problème d'encoding, pour ne pas avoir de problèmes (enfin, le moins possibles ) c'est que toutes ta chaines suive un seul et meme encodage.

    Tes données en bases sont en utf8. Ok
    Tes scripts php sont-ils utf-8 ?
    Est-ce que le flux de données qu'apache envoie au navigateur est utf-8 ? (Firebug > reseau > response header > Content-Type)
    Est-ce que ton flux xml contient un tag meta précisant l'encoding utf-8 ?

  4. #4
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    Merci tous les 2 pour votre réponse... mais j'avoue que je nage un peu!

    >> mon_nom_est_personne

    à quel moment dois-je exécuter cette requête? Est-ce que je dois l'inclure dans chaque SELECT, UPDATE et INSERT?

    genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT colonne FROM table WHERE colonne = 1 SET NAMES UTF-8
    ?

    >> Mr. N

    Base en utf-8 Ok
    Fichiers php en utf-8 Ok
    Content-type en text/html --> C'est peut-être de là que vient le problème?

    Est-ce que ton flux xml contient un tag meta précisant l'encoding utf-8
    heu... là je nage carrément

  5. #5
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Citation Envoyé par stöckli Voir le message
    >> mon_nom_est_personne

    à quel moment dois-je exécuter cette requête? Est-ce que je dois l'inclure dans chaque SELECT, UPDATE et INSERT?

    genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT colonne FROM table WHERE colonne = 1 SET NAMES UTF-8
    ?
    C'est une requete à part entière. Tu l'executes une fois pour toute juste après t'être connecté.
    Citation Envoyé par stöckli Voir le message
    >> Mr. N

    Base en utf-8 Ok
    Fichiers php en utf-8 Ok
    Content-type en text/html --> C'est peut-être de là que vient le problème?
    Est-ce que ton flux xml contient un tag meta précisant l'encoding utf-8
    heu... là je nage carrément
    Tu dois avoir ça dans le code source html recu par le navigateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>.........
        .....
    C'est la première balise que doit rencontrer le navigateur afin de déterminer l'encoding du flux.

  6. #6
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Citation Envoyé par stöckli Voir le message
    Content-type en text/html --> C'est peut-être de là que vient le problème?
    Ce n'est pas suffisant. Il faut le charset. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Content-Type:	text/html; charset=UTF-8

  7. #7
    mon_nom_est_personne
    Invité(e)
    Par défaut
    Et faut pas non plus oublier de sauvegarder ton fichier php en utf8
    Et ca devrait faire l'affaire. sinon pour regler mes problemes d'encodages j'utilise smarty et je joue avec les post est pre filter pour changer l'encodage final. en gros tout est en utf8 et a la fin, boum je convertie a ce que je veux.

  8. #8
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    re-merci pour vos conseils.... ça marche sans marcher! ;-)

    Je m'explique: en fait, j'avais visiblement mal cerné le problème: je viens d'ajouter un enregistrement (en cyrillique) à ma base et tout se passe bien (après avoir suivi vos conseils).

    Mais les 1356 enregistrements que j'ai importé, eux, ils continuent à m'afficher des ??????

    J'en déduis donc que le problème vient de l'encodage au moment de l'import de mes données.

    Ce qui déplace le problème, mais ne le résout pas encore...

    Si je résume mon processus:

    1) Un fichier Excel contenant 1356 enregistrements (avec nom et prénom en cyrillique, tout s'affiche bien dans Excel)
    2) J'enregistre en csv
    3) Je rouvre le csv et les noms / prénoms apparaissent comme ?????? (que je l'ouvre avec un tableur ou un éditeur de texte)

    Même si j'essaye de le sauvegarder en UTF-8 (j'utilise PSPad comme éditeur), rien ne change...

    Donc, en gros, comment faire pour exporter depuis Excel vers un format lisible par MySQL (csv ou SQL à priori) et qui ait un encodage correct?

    Je sais, on sort un peu de la rubrique php/MySQL, mais bon, ça reste au moins dans les soucis d'encodage!

  9. #9
    mon_nom_est_personne
    Invité(e)
    Par défaut
    je connais ce problem t'es dans la c*****.
    export le avec openoffice car tu peu regler l'encodage de sortie, les delimiteurs etc...

  10. #10
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    Ok, on s'approche, mais c'est pas encore ça

    Avec openOffice, je peux effectivement exporter mon csv encodé en utf-8 et l'ouvrir proprement avec openOffice ou mon éditeur de texte PSPad (mais quand même pas avec Excel ou Wordpad, faut pas rêver )

    Import à nouveau dans MySQL (je précise dans l'interface de phpMyAdmin que l'encodage est UTF-8)

    Et toujours le même problème... PhpMyAdmin reconnaît l'encodage (je peux browser mes tables sans problème) mais mon code php est toujours incapable de comprendre ce que c'est! Alors que si je crée un enregistrement en tadjik directement dans l'interface de PhpMyAdmin, pas de souci, il apparaît clairement même dans mon appli...

    Une question qui me passe par la tête: quel encodage UTF utiliser pour ma table et mes champs textes?? Est-ce que ça fait une différence entre utf8_general_ci, utf8_unicode_ci,.... ?

  11. #11
    mon_nom_est_personne
    Invité(e)
    Par défaut
    T'es sur que la Collation de tes tables sont bien uft8_general_ci ? et que phpmyadmin aussi ? parce que il a l'habitude de mettre par defaut sweden_latin_ci

  12. #12
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    Yes, tout est en utf8_general_ci: phpMyAdmin, mes tables, mes champs textes...

  13. #13
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    Bon, je continue mes investigations...

    Toujours pas moyen d'afficher correctement dans mon appli les données en cyrillique que j'ai importées d'Excel (transformées en csv utf-8 par OpenOffice puis importées via PhpMyAdmin). En revanche, dans l'interface de PhpMyAdmin, elles apparaissent correctement.

    Si j'entre de nouveaux objets via PhpMyAdmin (en tapant en cyrillique) via la commande Insert, ces nouveaux se comportent comme mes enregistrements importés (lisibles dans PhpMyAdmin, mais pas dans mon appli)

    Si j'entre de nouveaux objets via un formulaire de mon appli, les données sont illisibles dans PhpMyAdmin (genre: Ðоёбшоева) mais apparaissent correctement en cyrillique dans mon appli.

    C'est un peu le casse-tête.

    Pour mémoire, tout est en utf8_general_ci (MySQL connection collation, database collation, server collation, mes tables et mes champs textes)

    Des idées d'où peut venir la boulette?

    Merci!

  14. #14
    mon_nom_est_personne
    Invité(e)
    Par défaut
    Alors la desole mais a distance j'arrive a court d'idee.

  15. #15
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    A mon avis ça vient du fait que ta page web reçue par le navigateur n'est pas utf8 du coup le formulaire est envoyé dans le même charset que celui qui a servi à le générer... et il doit y avoir un conflit qq part.
    Tu as une url publique qu'on puisse tester ?

  16. #16
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    Pourtant j'ai mis UTF-8 comme charset... ou alors j'ai mal compris ta remarque? (c'est très possible, je suis pas le roi de la programmation!)

    Je fais tout en local, mais vais essayer de poser ça sur un serveur et je mets l'adresse dès que possible. Merci!

  17. #17
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    >> Mr. N

    Voilà, j'ai uploadé mon code et ma base ici:

    http://www.henriod.info/AKDN/porshinev/test/index.php

    Pour l'instant, je bosse uniquement sur les formulaires et les fonctions SQL, pas du tout sur le design et l'interactivité, d'où l'aspect un peu dègue du tout!

    2-3 explications:

    Formulaire "Find a household":

    te permet de chercher un habitant selon différents critères.
    Quelques exemples de noms qui existent dans ma base (last name) pour faire des recherches:

    Wood
    wood
    La grande woodz
    Абдулалишоев
    Шейхов
    Мирзоев

    Le connecteur entre les 3 critères est "AND". D'ailleurs, la requête sql est affichée avec la page de résultats. Si tu tapes un critère en cyrillique, il est correct dans la requête, mais la variable POST, elle, a une tête bizarre... pas encore bien compris la feinte...

    Formulaire "Go to household Id"

    te permet d'ouvrir un formulaire qui modifie une enregistrement existant (si l'Id est dans la base) ou d'en créer un nouveau (si l'Id n'existe pas encore)

    Report

    Montre tous les habitants d'un village avec quelques statistiques calculées sur différents champs de la table

    Dans PhpMyAdmin, tous les noms / prénoms de ces enregistrements apparaissent correctement

    Inutile de dire que ce n'est qu'une copie de ma base, donc sens toi libre de modifier des enregistrements si ça peut faire avance le schmilblick!

    Merci 1000 fois si tu as le temps d'y jeter un coup d'oeil et de me dire si tu y vois qqch de bizarre...

  18. #18
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Le problème ne vient pas a priori de la partie cliente.

    Avant d'effectuer la requete sql que tu affiche en haut de la page, est-ce que tu peux afficher le resultat de cette requetes sql:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    show variables like 'character_set%'
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $res = mysql_query("show variables like 'character_set%'");
    echo '<pre>';
    while($data = mysql_fetch_assoc($res)) {
      var_dump($data);
    }
    echo '</pre>';

  19. #19
    Membre averti
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Par défaut
    C'est fait...

  20. #20
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Y a que du latin1... ça sent pas bon.

    En fait lorsque un client (ici php) se connecte au serveur mysql, celui-ci lui dit que les échanges seront dans tel ou tel charset. Ici c'est latin1... Or toute ta chaine est utf8 sauf ce maillon.

    As-tu fait un SET NAMES comme préconisé au début de ce thread ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Clavier] caractères qui générent des erreurs sous Apache/PHP/MySQL
    Par kolby dans le forum Périphériques
    Réponses: 1
    Dernier message: 12/03/2013, 22h45
  2. [MySQL] Problème avec les caractères turcs PHP/Mysql
    Par sencmaster dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/08/2010, 15h58
  3. [MySQL] Mysql/php et les caractères arabes (réglé)
    Par samad dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/08/2009, 19h31
  4. [PHP-JS] Encodage caractères MySQL vers PHP
    Par poubelle039 dans le forum Langage
    Réponses: 2
    Dernier message: 18/10/2007, 17h46
  5. PHP/MySQL stocker le caractère €
    Par mguinot dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/05/2006, 16h52

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