Carnet Wiki

utf8 vrac de notes à deboguer

Version 7 — Janvier 2013 JLuc

Interviennent les paramètres suivant, dont il faut s’assurer qu’ils restent toujours en phase :

Pour les données :
-  le codage de la table dans la base de donnée
-  le codage de la base de donnée (est-ce utile vraiment, si on connait le codage de la table ?)
-  le codage du transfert, lorsqu’il y a transfert. (c’est quoi cette notion au juste ?)
-  le codage du CONTENU de la table, qui en cas d’erreur à une étape peut être différent de celui théorique (indiqué par le codage de la table)

Pour le source :
-  le codage du fichier (ISO, utf8 avec ou sans bom...). Pour SPIP (càd les .html ?) il faut le BOM, mais il ne le faut pas pour les fichiers php. A noter que php n’élimine pas le bom lors d’un include().
-  la manière avec laquelle l’éditeur de texte comprend l’encodage du fichier.


Erreurs possibles

-  déclarer quelquepart utf-8 alors qu’il faut écrire UTF-8 ou UTF8 ou utf8
-  l’inverse et toutes les variations possibles

À php on dit mb_internal_encoding("UTF-8");
mais à MySql on dit SET NAMES 'utf8'

-  des données ou du code en utf8 dans un contenant déclaré en ISO
-  des données ou du code en ISO dans un contenant déclaré en uf8

-  un contenant en utf8 lu ou analysé par un outil qui croit que c’est de l’ISO
-  un contenant en ISO lu ou analysé par un outil qui croit que c’est de l’utf8

Par ailleurs, les fichiers déclarés comme utf8 peuvent avoir un BOM ou ne pas en avoir.

Cela introduit une autre source d’erreur :
-  un fichier créé sans BOM ou analysé par un outil qui croit qu’il y a un BOM ou qui a besoin qu’il y en ait un, alors que le fichier n’en a pas.
-  l’inverse et toutes les variations possibles.


Outils de dépatouillage avancé

  1. Le témoignage de Fil : http://zzz.rezo.net/Reparer-le-charset-d-une-base-SPIP.html pour corriger un site où des données utf8 ont été enregistrées dans des tables ISO (= latin1)
  1. Faire connaissance avec des caractères accenctués (ou d’autres caractères spéciaux ?) et la manière symptomatique avec laquelle ils se présentent en cas d’erreur.
    C’est à dire : apprendre à lire les hiéroglyphes.
    Se documenter sur comment l’ISO et l’utf8 codent les caractères accenctués et autres caractères spéciaux.

Données :
-  regarder le contenant : codage déclaré pour une table
-  regarder le contenu (comment ? avec quel outil et comment régler cet outil pour qu’il n’introduise pas de biais supplémentaires ? ) : y a t il des caractères bizares ? les caractères bizarres ressemblent ils à des hiéroglyphes connus, comme de l’utf8 regardé dans une page ISO ou le contraire ?

Code :
-  idem


Fonctions PHP

Voir http://php.net/manual/fr/ref.mbstring.php

-  quelles fonctions de chaine classiques fonctionnent bien avec l’utf8 ?

  • str_replace ?
  • preg_replace ?
  • trim ?
  • strlen ?
  • strpos ?
  • etc ?

SPIP a créé une fonction spip_strlen indépendante du charset, qui appelle strlen en ISO, sinon mb_strlen si elle existe, ou sinon l’émule avec strlen(preg_replace(',[\x80-\xBF],S', '', $c));.
Cela pourrait indiquer que preg_replace fonctionne bien avec l’utf8.
Dans quel cas peut on utiliser des fonctions ’classiques’ et quand faut il utiliser les mb_ ?

-  quelles fonctions exigent par contre une fonction mb_truc ?

On peut supposer que toutes les fonctions qui ont une contrepartie mb_truc ne sont pas compatibles avec l’utf8.

-  faut il traduire preg_replace en mb_ereg_replace ? Apparament non vu que spip_strlen fait appel à preg_replace sur de l’utf8 (mais dans un cas où la chaine à remplacer ne contient pas d’utf8. Peut être est-ce nécessaire dans le cas contraire...)


Recommandations pour de bonnes pratiques

-  Regarder en particulier la fonction mb_internal_encoding(« UTF-8 ») ; http://php.net/manual/fr/function.mb-internal-encoding.php

-  Aussi : mb_http_output http://php.net/manual/fr/function.mb-http-output.php


les caractères

-  voir http://www.lookuptables.com/

-  \n == 

- également appelée U+2009 est ici directement compris entre les pipes : | | c’est une espace fine (à comparer à une espace normale ici : | | ; dans ce contexte on voit pas beaucoup la différence. Et ici une espace « sixième de m » : | | ah on voit mieux )