Bonjour,

Depuis hier je parcours pas mal de doc sur l'encodage, je n'avais jamais vraiment eu de problème mais là je suis un peu perdu.

En fait à la base j'avais commencé le développement du site sous Windows avec Notepad++.
Mais depuis peu je suis passé sous Mac où j'utilise Textmate.

J'ai décidé d'utiliser le codage suivant :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

header("Content-Type: text/html; charset=iso-8859-1");


Afin d'être sûr de toujours travailler en iso-8859-1 j'ai changé l'encodage par défaut de Textmate.

Sur mon site les utilisateurs commentent une photo par exemple avec ce genre de texte : "C'est un été indien !"
Le contenu de la variable php est bien correcte, mais dans la db mysql j'obtiens ce genre de chose : "C'est un ?t? indien !"
Le champ dans la db est de type standard : latin1_swedish_ci (jamais eu de problème avec ce type)
Par contre je remarque dans les paramètres de mon hébergeur : Jeu de caractères pour MySQL: UTF-8 Unicode (utf8)

J'arrive a faire fonctionner le code correctement en utilisant la fonction php suivante avant le chargement dans la db : utf8_encode($var);
Alors dans ce cas le contenu de $var dans ma db est correcte aucun problème d'accent.

Je n'arrive pas à comprendre pourquoi je suis obligé d'avoir recours à cette fonction pour avoir des données correcte dans ma db, alors que depuis le début j'essaye de travaille en iso.
Est-ce du au jeu de caractère défini dans MySQL ?

Merci d'avance pour votre aide.
ZbergK.
Bonjour,

De manière générale, pour un nouveau site je recommanderais de travailler en UTF-8. ISO-8859-1 a un jeu de caractères limité.

Mais si tu travailles en ISO-8859-1, les règles à suivre sont:
- travailler avec ce codage de caractères d'un bout à l'autre de la chaine;
- ne jamais utiliser de fonction pour convertir des données d'un codage à l'autre, sauf s'il s'agit de données de source extérieure au site (fil RSS d'un site tiers, en UTF-8, par exemple).

Donc si la base de données est configurée pour utiliser de l'UTF-8, il faut changer ça.

ZbergK a écrit :
mais dans la db mysql j'obtiens ce genre de chose : "C'est un ?t? indien !"

En fait tu n'en sais strictement rien, car les moyens que tu utilises pour consulter ta base de données ne te donnent pas une représentation exacte et 100% fiable de tes données. Je suppose que tu utilises phpMyAdmin? Il faudrait savoir comment est configuré le serveur MySQL, et comment est configuré phpMyAdmin. Il est probable qu'une conversion des données soit faite.

Pour information:
- MySQL a tendance à convertir les données à la volée d'un encodage à l'autre, quand il pense avoir des données dans un encodage A et qu'on lui demande des données dans un encodage B.
- L'encodage B demandé dépend de plusieurs directives, mais pour faire simple on peut utiliser SET NAMES nom_de_l_encodage. Dans ton cas, tu peux utiliser un "SET NAMES latin1" juste après l'ouverture de la connexion MySQL.
Merci Florent pour ces informations.

Je me suis en effet posé la même question, je vois ce que phpmyadmin veut me montrer.
J'ai donc installé les "Tools MySql" qui m'affiché la même chose.

Je pense que le serveur est configuré en UTF8 car il y a cette ligne dans phpmyadmin au niveau des informations serveurs:
Jeu de caractères pour MySQL: UTF-8 Unicode (utf8)

Je vais essayer en forçant l'encodage comme tu me l'as proposé avec :
SET NAMES latin1
Je suppose que je rajoute cette ligne juste après la connexion à la db.

J'avais lu sur internet que MySql convertissait automatiquement les données.
Donc par exemple si je fais un insert dans un champ de type : latin1_swedish_ci MySql devrait le convertir correctement.
En fait est-ce que c'est correcte d'utiliser ce type latin1_swedish_ci ?
Par défaut c'est ce que MySql me propose, j'ai jamais changé ...

Merci d'avance pour votre aide.
ZK
ZbergK a écrit :
Je pense que le serveur est configuré en UTF8 car il y a cette ligne dans phpmyadmin au niveau des informations serveurs:
Jeu de caractères pour MySQL: UTF-8 Unicode (utf8)

MySQL a une demi-douzaine de réglages qui prennent en compte les codages de caractères. Tu peux les voir sur la page «Variables et réglages du serveur».

ZbergK a écrit :
Je suppose que je rajoute cette ligne juste après la connexion à la db.

Oui. Voir la documentation de MySQL.

ZbergK a écrit :
Donc par exemple si je fais un insert dans un champ de type : latin1_swedish_ci MySql devrait le convertir correctement.

Je ne sais plus exactement comment ça se passe. À priori, si tu envoies des données à MySQL via une connexion déclarée en ISO-8849-1 (via un SET NAMES latin1), et que les colonnes et tables de ta base de données sont marquées comme étant en latin1 aussi, MySQL ne devrait faire aucune conversion des données.

ZbergK a écrit :
En fait est-ce que c'est correcte d'utiliser ce type latin1_swedish_ci ?

Pour un site en ISO-8859-1, oui. Je te laisse te renseigner sur les interclassements de MySQL et leur rôle exact.

Un peu de lecture:
http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html
Modifié par Florent V. (13 Sep 2010 - 15:19)