Encodage et charset

De Memodev.

Aller à : Navigation, rechercher

TextLettre.png Un charset (un jeu de caractère) est un ensemble bien défini de caractères. Le plus simple est l'ASCII (liste de caractères de base US). Le plus complet et moderne est l'Unicode.
L'encodage d'un jeu de caractères spécifie comment ces caractères seront effectivement stockés sous forme d'octets compréhensibles par un ordinateur. Pour un jeu de caractères donné, il y a souvent le choix entre de nombreux encodages différents, chacun ayant ses avantages et ses inconvénients.

Sommaire

Tutoriels.png Les meilleurs tutoriels Encodage et charset

BoiteNoir.png Quel encodage choisir ?

On ne sait pas toujours quel encodage choisir. Ce qui est sûr c'est qu'il faut bien réfléchir car une fois votre choix effectué, une modification d'encodage sera très compliquée. On hésite souvent entre UTF-8 et ISO 8859-1, voici un bon article d'Alsacréation qui liste les avantages et inconvénients de chacun.

Nous vous conseillons d'opter pour l'UTF-8 qui est recommandé par le W3C     . C'est le plus couramment utilisé, et il ne vous fermera pas de portes pour l'avenir.

Run.png Comment bien appliquer un encodage ?

Pour éviter au maximum les problèmes d'encodages, il faut que toutes les briques de votre application possèdent le même encodage. Nous prenons l'exemple de l'UTF-8.

BDD

MySQL supporte pleinement l'UTF-8 depuis la version 4.1. Il existe plusieurs "COLLATE" (Interclassement en Français). On pourra utiliser utf8_bin pour la comparaison sensible à la casse et utf8_general_ci pour la comparaison insensible à la casse. (voir une explication      sur les différences de ces interclassements)

Pour éviter tout problème d'encodage avec votre BDD, il faut spécifier le charset et le collate sur :

Voici les détails ci-dessous.

Pour indiquer l'encodage d'une base lors de sa création (source)

Pour indiquer l'encodage d'une table et de ses champs

Pour indiquer l'encodage sur votre serveur MySQL


Encodage des fichiers sources

Vérifiez l'encodage de vos pages de code (HTML, PHP, JSP, CSS, JavaScript ...). Pour cela, il suffit de les ouvrir sous notepad++ et de vérifier dans le menu "Encodage" que l'encodage est correct. Si ça n'est pas le cas, toujours dans le menu "Encodage", cliquez sur "Convertir en UTF-8 (sans BOM)". (voir un script PHP pour convertir tous les fichier d'un dossier en UTF-8).

Pourquoi "sans BOM" ?

Le BOM (Byte Order Mark) consiste à ajouter le caractère U+FEFF (espace insécable de largeur nulle «zero-width no-break space») en début de fichier qui indique si le fichier est écrit en big-endian ou en little-endian, autrement dit, si les octets sont écrit de la gauche vers la droite ou inversement (source     ). Il est important de ne pas utiliser le BOM (source     ) car dans un code java ils pourront donner des erreurs du style illegal character: \65279, et dans un code PHP provoquer des erreurs du style Warning: Cannot modify header information - headers already sent (source). Pour trouver vos fichier qui possèdent des BOM, vous pouvez utiliser ce script PHP, ou cet outil en ligne du W3C     , ou ce script Perl      qui supprime carrément les BOM. Si vous avez encore des problèmes de BOM, voir cet article du W3C     .

Comment bien configurer l'encodage de mes fichiers sous Eclipse ?

En-tête HTTP

Il faut positionner l'encodage dans l'en-tête HTTP pour indiquer au navigateur quel encodage utiliser pour afficher les pages (sinon, par défaut, il utilisera l'ISO 8859-1). Il est possible de le faire avec Apache ou avec du PHP (ou tout autre langage de script). Nous conseillons de le faire avec du PHP car vous aurez un meilleur portage de vos scripts.

Avec Apache

Avec Apache il est possible de spécifié l'encodage soit dans les fichiers de configuration d'apache     , soit dans un .htaccess     . Ceci dit, il n'est pas utile de spécifié l'encodage avec Apache puisque le faire dans vos fichiers PHP est suffisant et est recommandé pour des questions de portabilité de code.

Avec PHP

Voici comment faire en PHP (voir la source du W3C pour les autres langages     :

header("Content-Type: text/html; charset=utf-8");

Envoi de requête Ajax

Les requetes Ajax utilisent par défaut l'encodage utf-8 pour l'envoi des paramètres. Forcer un type d'encodage différent (ISO par exemple) ne marchera pas avec IE. Donc pour que ça fonctionne sur tout les navigateurs, il faut forcer l'encodage des paramètres en utf-8, quel que soit l'encodage de votre application, .

Par exemple, pour mettre le bon encodage avec jQuery :

// Initialisation des requêtes ajax
$.ajaxSetup({
    contentType: "application/x-www-form-urlencoded;charset=UTF-8"
});

Le fait d'envoyer les paramètres en utf-8 sur une application en ISO peut être étonnant, mais ça fonctionne car les paramètres sont automatiquement convertis coté serveur, il n'y a pas besoin de décoder le paramètre de utf-8 à ISO. Si jamais ça ne fonctionne toujours pas, alors utiliser une fonction pour décoder les paramètres de type chaine : utf8_decode($_GET["nom_param"]) en PHP et URLDecoder.decode(req.getParameter("nom_param"),"UTF-8") en JSP.

PHP

PHP travaille nativement en ISO. Pour utiliser de l'UTF-8, il vous faut utiliser des fonctions spécifiques, prévues à cet effet (source).

Les différent points qui posent problème avec l'utf8 et le PHP :

HTML, XHTML

Ajoutez la balise meta entre les balise head :

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Info : Cette déclaration sera ignorée si l'encodage est présent dans l'en-tête HTTP (donc si l'encodage est spécifié avec PHP ou avec Apache). Ceci dit elle devra tous le temps être indiquée, car dans le cas où l'internaute sauvegarde la page en local (Fichier -> Enregistrer sous), il ne recevra plus l'en-tête HTTP envoyé par le serveur.

Si vous souhaitez utiliser du HTML5 ou du XHTML avec content-type XML, veuillez voir les explications du W3C     .

CSS

Ajouter une en-tête au fichier :

@charset "UTF-8";

Attention : Cette déclaration doit commencer au premier caractère du ficher pour être prise en compte.
Info : De la même façons que pour HTML et XHTML, cette déclaration est rarement utilisée mais est néanmoins recommandée (source     ).

Loupe.png Détecter et comprendre les problèmes d'encodage

Pour détecter les problèmes d'encodage, il suffit d'insérer les caractères suivant dans une page ou dans un formulaires :

! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ


Problème : La page affiche des caractères de ce type : "é", "î", "Ã", ...
Solution : Les données ont été enregistrées au format UTF-8, et le navigateur les affiche en pensant avoir affaire à de l'ISO. Spécifier l'encodage UTF-8.


Problème : La page affiche des caractères de ce type : "�"
Solution : Les données ont été enregistrées au format ISO, et le navigateur les affiche en pensant avoir affaire à de l'UTF-8. Spécifier l'encodage ISO.


Refresh.png Migrer de ISO-8859-1 à UTF-8

Source

Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Catégories
Boîte à outils