Encodage et applications php
Par défaut, le serveur apache de osti renvoit du UTF8. On peut modifier le comportement en définissant le charset dans les entetes.
header('Content-Type: text/html; charset=utf-8');
Si on écrit un "é" dans un script php, il faut que le fichier soit sauvegardé en utf8. Sinon, il faut utiliser la fonction utf_encode qui va traduire vers de l'utf8.
MYSQL
J'ignore le comportement par défaut mais j'ai observé deux choses:
- Une table sur le serveur mysql gaia.auf dont les champs sont tous en utf8_general_ci renvoit un jeu de caractère en utf8 si il est appellé à partir de gaia et renvoit du iso (je suppose iso mais je sais que c'est pas du utf8) si il est appellé à partir de osti.auf. Le même comportement est observé sur le serveur mysql db.auf.
MoussaNombre : "utf8_general_ci" est l'interclassement - collation en anglais - (l'ensemble de règles qui permettent la comparaison des caractères dans le jeu de caractères en question). Ici le jeu de caractères - charset - est utf-8.
Donc un script écrit en ut8, avec des tables mysql en utf8 (sur db.auf ou gaia.auf), ne fonctionnera pas correctement sur osti qui est pourtant entièrement configuré en utf8.
La solution:
Il suffit de forcer mysql à renvoyer du utf8.
Euuhhh... ne serait-ce pas plutôt forcer php à initialiser la connexion en utf-8 -- MoussaNombre
Une simple requête mysql_query("SET NAMES 'utf8'"); après avoir effectué la connexion suffit à rétablir l'ordre des choses.
MoussaNombre : SET NAMES "utf8" (utilisé dans le script php de connexion à la BD) positionne les trois variables système utilisées lors de la connexion :
- character_set_client = utf8
- character_set_connection = utf8
- character_set_results = utf8
Résultats de quelques recherches
Paramètres mysql retournés lors d'une interrogation via phpmyadmin
SHOW VARIABLES LIKE 'char%' character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_results utf8 character_set_server utf8 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/
Paramètres mysql retournés lors d'une interrogation via php sur osti.auf
mysql_query ("SHOW VARIABLES LIKE 'char%'"); character_set_client latin1 character_set_connection latin1 character_set_database utf8 character_set_results latin1 character_set_server utf8 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/ Encodage retourné par la fonction php mysql_client_encoding latin1
Paramètres mysql retournés lors d'une interrogation via php sur intranet.auf
character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_results utf8 character_set_server utf8 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/ Encodage retourné par la fonction php mysql_client_encoding latin1
La fonction php mysql_client_encoding() retourne toujours le charset par défaut du connecteur mysql, même si on spécifie que les transactions mysql doivent se dérouler en monde utf8 avec "SET NAMES 'utf8'". (L'affichage se fait alors correctement mais le charset par défaut est toujours du latin1).
Conclusion des recherches -- par MoussaNombre
N'ayant pas trouvé comment configurer PHP5 globalement pour qu'il utilise de l'UTF-8 lors des connexions vers mysql, on est obligé d'employer la solution proposée plus haut par Ali (SET NAMES). L'autre possibilité était de paramétrer le serveur MYSQL pour qu'il initialise TOUTES les connexions en UTF-8 : init_connect = utf8 dans /etc/mysql/my.cnf. Solution abandonnée pour ne pas perturber d'éventuels applications existantes qui se connecteraient en "latin1".