Problème d'affichage de base encodée en utf-8

WRInaute occasionnel
Bonjour,

Je suis entrain de créer la version Russe d'un site et j'ai un problème d'affichage de caractères.
J'ai modifié toute la base de donnée en utf-8, les tables, les champs, tout.
Mes pages php sont encodées en utf-8.

Le problème est lorsque j'entre directement du texte Russe Cyrillic (exemple "Квартира") via PHPMyAdmin, PHPMyAdmin m'affiche bien ce texte en retour mais sur mon site je vois des ???? à la place.
Et inversement, si via l'interface backoffice de mon site, j'entre du texte en Russe alors PHPMyAdmin affiche par exemple des "é" à la place des "é" mais sur mon site alors je vois bien le texte.

Exemple sur cette page, voyez sur la petite fiche blanche les ???? il correspond à du texte que j'ai entré à la main dans PHPMyAdmin, tout le reste s'affiche bien car entré via les pages du backoffice.

Voyez)vous où est le problème ?

Merci d'avance.
 
WRInaute impliqué
Lorsque tu te connectes au serveur SQL, il faut lui préciser que les données que tu vas insérer sont en UTF-8.
La requête suivante permet de le faire (pour MySQL):
SET names 'utf8';
Cette requête est à faire avant toute autre.

Pour PHPMyAdmin, tu dois pouvoir, si ce n'est déjà fait, configurer la connexion à l'aide d'un menu quelque part.

J'ai réalisé un article sur mon blog pour configurer un projet entier dans un jeu de caractères. Mais il est en cours de finalisation, donc inutile que je donne de lien ;)
 
WRInaute occasionnel
Merci mais je ne vois pas où insérer ce paramètre SET names 'utf8';

Sinon voici les paramèrtres de mon serveur SQL (un mélange de tout...) :? , c'est un mutualisé chez Sivit donc je ne peux pas changer les valeurs:

Code:
Variable					Valeur pour la session / Valeur globale
auto increment increment			1
auto increment offset				1
automatic sp privileges			ON
back log						50
basedir						/usr/
binlog cache size				32 768
bulk insert buffer size			8 388 608
character set client				utf8
(Valeur globale)					latin1
character set connection			utf8
(Valeur globale)					latin1
character set database			latin1
character set filesystem			binary
character set results				utf8
(Valeur globale)					latin1
character set server				latin1
character set system				utf8
character sets dir				/usr/share/mysql/charsets/
collation connection				utf8_unicode_ci
(Valeur globale)					latin1_swedish_ci
collation database				latin1_swedish_ci
collation server					latin1_swedish_ci
 
WRInaute impliqué
Comment as-tu eu ce retour ?

Sinon, la requêtes "SET names 'utf8';" est à faire dans ton code PHP.
En gros, à l'ancienne :
mysql_query("SET names 'utf8';");

À adapter selon ton code (framework, PDO, etc.).

Sinon, dans ton retour, tu sembles bien en UTF-8 sur ta connexion dans phpMyAdmin.
 
WRInaute occasionnel
Ok j'ai ajouté cette ligne après le mysqlconnect et ça marche .... mais ça déconne pour les caractères qui s'affichaient bien avant.
Les pages affichent maintenant de la même manière que via PHPMyAdmin, c'est mieux dirait-on mais je fais quoi maintenant ?
je me retape tout dans la base pour changer les textes proprement ?

Concrètement, tout ce qui a été entré en russe (à l'époque où la base était en latin1), il n'apparait plus que des "Какая роскÐ", voir la page.
 
WRInaute occasionnel
C'est le bordel maintenant puisque avec cette nouvelle ligne, mes pages en français affichent des "é" à la place des "é" ... etc
Je vais devoir la supprimer pour l'instant.
Mais comment puis convertir cette base ?
Pour comprendre la situation, actuellement via PHPMyAdmin je vois en français les accents comme des é, puis certaines entrées en Russe je vois parfois des "Вилла" et parfois des "Это", c'est la panique :mrgreen:
 
WRInaute occasionnel
Si tes tables sont en utf8 et que tu les a bien rempli via des requetes e utf8, lors de leur affichage, il faut les appeler en utf 8 via mysqli_set_charset ($connexion, 'UTF8') juste après la connexion à la bdd et avant l'exécution des requêtes.
 
WRInaute impliqué
C'est parce que lorsque tu as changé le jeu de caractères de la base, tu n'as pas converti les chaînes présentes vers le nouveau jeu de caractères.

Regarde sur http://dev.mysql.com/doc/refman/5.0/fr/alter-table.html.

Fait une recherche sur "Depuis MySQL 4.1.2" tu tomberas sur la partie qui doit t'intéresser (vive les ancres :/).
 
WRInaute accro
Pour convertir une base de latin1 vers UTF8, j'utilise:
Code:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
 
WRInaute impliqué
Penses tout de même à faire des sauvegardes, on ne sait jamais.

@spout : j'ai lu que cette commande convertissait à partir du jeu de caractères par défaut du serveur. Si le jeu par défaut n'est pas le bon, ça risque pas de foirer ?
 
WRInaute occasionnel
spout a dit:
Pour convertir une base de latin1 vers UTF8, j'utilise:
Code:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
Je viens de le faire avec PHPMySQL dans l'onglet SQL pour la table qui pose problème, il me dit que la commande a bien été effectuée mais ça m'affiche toujours des "é".

Je me demande si mon problème n'est pas inversé ... je vais faire cette même commande mais vers ISO pour voir
 
WRInaute occasionnel
Quand je fais la commande suivante:
Code:
iconv -f iso-8859-1 -t utf8 ma_base.sql > ma_base_utf.sql
J'ai encore plus de caractères spéciaux:
L'équivalent du "é" est passé de
Code:
é
à
Code:
é
C'est le merdier.
 
WRInaute accro
Mon conseil : ne te base pas sur PhpMyAdmin pour ce qui est de vérifier la qualité d'encodage. Mieux vaut utiliser un frontend mysql comme SQLYog ou Heidisql.
 
WRInaute occasionnel
UsagiYojimbo a dit:
Mon conseil : ne te base pas sur PhpMyAdmin pour ce qui est de vérifier la qualité d'encodage. Mieux vaut utiliser un frontend mysql comme SQLYog ou Heidisql.
J'utilise Sequel Pro et ça m'affiche la même chose.
Je regarde également avec un éditeur de texte et je vois la même chose.

Je pense que ce qui s'est passé est que j'avais déjà fais une conversion de la base de iso en utf mais certainement mal faite. Ensuite j'ai changé tous les paramètres de sql de iso en utf.

J'ai l'impression là que mon problème est du genre des caractères du style iso écrits en utf sur le l'utf, un truc comme çà, sinon j'y comprends rien.
 
WRInaute passionné
Bon, pour trouver où est le bug, tente de jouer à coup de utf8_decode/encode, (n'hésites pas à en mettre 2 d'affilés).

Après je vais peut-être dire des conneries, mais ton PHPMyAdmin doit être sur du PHP5 et ton site est sous PHP/4.3.11.
D'après le peu que je me rappelle du PHP4, c'était une vraie merde pour tout ce qui était "alphabet non standard" (chinois/russe donc).

Sinon, ta page s'affiche parfaitement mis à part les 5 premiers caractères de la balise title qui sont remplacés par ?????

Sinon, pour ta DB, je te conseille de trouver la bonne formule, et de convertir en PHP
tu fais un SELECT de tout ce qui n'est pas en "utf8 correct", tu le utf8_encode, puis tu update avec la sortie PHP.

Bon, voilà pour des pistes en vrac, j'ai eu le même soucis en migrant de wordpress à un site custom.
Pour ta base, tu as 2 jeux de charset, celui de la table, et celui de la base (tu as ça dans l'onglet Opération de PHPMyAdmin)
 
WRInaute occasionnel
@Julia41:
Les caractères que tu vois bien sont ceux écrits en dur dans le fichier PHP.
Les ???? sont ceux récupérés dans la base.

Pour résumer :
Si j'ajoute la ligne SET names 'utf8' alors l'inverse se passe:
Les ???? de la base sont bien affichés par en caractères russes.
Les caractères russes en dur dans le fichier PHP sont affichés par des "Вилла"
Dans ce cas, le navigateur affiche bien tous les caractères tels que je les vois avec PHPMyAdmin, ce qui prouve que le problème est bien dans la base !

A résoudre:
Je viens de mettre des bouts du fichier de la base à télécharger.
Comment faut-il convertir ce fichier pour bien voir les caractères ?
Ce doit être possible vu que le navigateur le fait bien...
Le problème sera résolu quand tous les caractères seront bien visibles dans le fichier.
 
WRInaute occasionnel
Bon, le problème est résolu.
Uniquement la partie Russe est perdue précédemment entrée est perdue. C'est pas grave j'ai les sources.
En fait la base contenait du mélange d'iso et d'utf, à cause d'une ancienne conversion. Même dans le Russe il y avait du mélange, le vrai bordel !

Donc les conversions du type iconv -f iso-8859-1 -t utf8 source.sql > dest.sql soit n'étaient pas valides ou ne faisaient qu'empirer, l'ouverture et l'écriture en iso ou utf avec l'éditeur de texte m'indiquait une opération non valide ou empirait. Même Word ne savait pas quoi en faire du fichier !

J'ai donc fini par le faire à la main 8) ça a pris une demi heure et basta.
Avec l'éditeur de texte, remplacement de chaines de caractères spéciaux par ceux avec accents.
J'ai pu donc activer la ligne SET names 'utf8';
Maintenant je vois bien les accents dans PHPMyAdmin et pareil dans le site.
 
WRInaute impliqué
Le mélange de jeu de caractères est le pire problème qu'on puisse rencontrer.
Tu as tout de même réussi à résoudre le problème, c'est le principal.

Dans un de mes précédents postes, j'indiquais l'écriture d'un article en cours de finalisation sur l'utilisation d'un jeu de caractères dans un projet.
Vous pourrez donc trouver l'article intitulé : PHP / MySQL : comment résoudre les problèmes d’accents ?.

Il pourra intéresser d'autre personnes rencontrant des problèmes.
Par contre, j'explique simplement comment mettre l'environnement dans un même jeu de caractères, il n'est pas question de conversion. Peut-être dans un prochain article.
N'hésitez pas à me faire des retours (par mp, mail, ou commentaire).
 
Discussions similaires
Haut