Bonjour !
Je suis actuellement en cours de réalisation d'un site franco-chinois.
Problèmes donc de caractères... (soupir fataliste...)

Voilà où j'en suis :
- La Page PHP déclarée utf-8
- SousPHPMyAdmin :
- L'interclassement pour la connexion MySQL est utf8_bin
- L'interclassement de la table est utf8_bin
- Tous les champs de type texte sont d'interclassement utf8_bin

Deux cas de figures se présentent :

Si je me connecte avec SET CHARACTER SET 'utf8'
- les caractères accentués européens passent nickel partout y compris dans PhpMyAdmin
- Les caractères chinois donnent du ??? ??? dans PhpMyAdmin, et à l'affichage web.

Si je me connecte sans SET CHARACTER SET 'utf8'
- les caractères chinois et européens passent en 病人姓å dans PhpMyAdmin
- l'affichage web est correct

Est-il possible d'avoir un affichage correct de tous les caractères à la fois dans PhpMyAdmin et en web ?
Je vais faire ensuite des requètes d'auto-complétion, et je préfèrerais autant partir sur de bonnes bases (et comprendre une fois pour toutes ce qu'il se passe...)

Merci beaucoup pour le coup de pouce !
Modifié par yakou32 (15 Mar 2009 - 18:31)
Bonjour,

En général on utilise SET NAMES plutôt que SET CHARACTER SET. Il me semble que la différence n'est pas énorme, cependant.

Avec un SET NAMES utf8, voici ce qu'on (le client MySQL) dit au serveur MySQL:
- les messages que je t'envoie sont en UTF-8;
- avant de les exécuter, il faut les traduire en UTF-8 (donc pas de traduction);
- il faut me renvoyer de l'UTF-8.

Rien de bien méchant, tant que les données à récupérer sont marquées comme étant en UTF-8 (c'est à priori le cas ici). Si on veut éviter que le serveur MySQL ne tente des conversions intempestives (et couteuses en ressources), on peut utiliser les directives suivantes:
SET character_set_client = utf8;
SET character_set_connection = utf8;
SET character_set_results = NULL;
À part le NULL qui remplace un utf8, c'est équivalent à ce que fait un SET NAMES utf8.
Bien sûr, tout ça n'est nécessaire que si la configuration du serveur est différente (utilisation de latin1 par défaut).

Doc: http://dev.mysql.com/doc/refman/5.0/fr/charset-connection.html

Questions à tout hasard:

1. Tu as la certitude que les données sont bien encodées en UTF-8? Le fait que les tables soit marquées avec un interclassement utf8-bin (utf8-general-ci serait plus adapté il me semble, pour les classements de données) ne signifie pas que les données sont réellement en UTF-8 (de même que pour une page web l'encodage déclaré n'est pas nécessairement l'encodage réel).
Quand on n'est pas sûr de ses données, le meilleur moyen de les vérifier (à ma connaissance) est d'écrire un script qui récupère ces données sans les convertir, et de visualiser le résultat dans un navigateur (en modifiant l'encodage d'interprétation via le menu Affichage du navigateur). Pour récupérer des données sans qu'elles soient converties, voir au début de mon message.

2. Côté site, les pages sont bien déclarées en UTF-8 (balise META et en-tête HTTP Content-Type)?

3. Côté PhpMyAdmin, les pages sont bien déclarées en UTF-8 (idem)?

4. Tu n'utilises pas de fonctions (notamment en PHP) qui ne gèrerait pas correctement l'UTF-8?
Merci pour cette réponse très précise, et...
ça marche !!!
En passant SET NAMES au lieu de SET CHARACTER SET, le chinois apparaît correctement à l'affichage et dans PhpMyAdmin. C'était donc la pièce manquante du puzzle !
Merci beaucoup !