Table des matières

UTF8

Si vous avez décidé de passer votre serveur en UTF8, la plupart des fichiers textes/html etc.. contenant des accents deviendront difficilement lisible.

Dans mon cas d’un serveur web, je devais réencoder tous les fichiers du site.

Pour cette manip, mon choix s’est tourné sur la commande recode mais étant données que j’avais déjà commencer à réencoder certain fichier, je devais faire attention à ne pas réencoder un fichier déjà réencodé..

J’avais donc créé un petit script (dispo au dernier chapitre de cette page) permettant de tester le format du fichier puis de l’encoder si nécessaire.

Configuration

aptitude install locales
dpkg-reconfigure locales

Choisissez alors fr_FR.UTF8

Connaitre l'encodage d'un fichier

Avec la commande file qui permet de connaitre le type d’un fichier et en rajoutant l’option -i

# file plan.php
plan.php: HTML document text
# file -i plan.php
plan.php: text/html; charset=iso-8859-1
# file -i index.php
index.php: text/x-php; charset=utf-8

Convertir avec iconv

iconv permet de convertir un fichier et renvoie le résultat sur la sortie standard ce qui n’est pas forcément pratique pour réencoder plusieurs fichiers d’un site web par exemple.

iconv -f iso-8859-1 -t utf-8 ancienFichier > nouveauFichier    # vers UTF-8
iconv -f utf-8 -t iso-8859-1 ancienFichier > nouveauFichier    # vers latin-1

Convertir avec recode

recode réencode le fichier qu’on lui soumet.

# file -i plan.php
plan.php: text/html; charset=iso-8859-1
# recode iso-8859-1..utf-8 plan.php
# file -i plan.php
plan.php: text/html; charset=utf-8

On peut réencoder plusieurs fichiers d’un coup.

# recode iso-8859-1..utf-8 *
Attention à ne pas réencoder plusieurs fois un fichier déjà réencodé ! Sinon votre fichier va être complètement pollué de caractères bizard.

Convertir avec vim

Quand vous ouvrez un fichier non utf8 avec vim, la mention [converti] apparait en bas.

Pour convertir ce fichier en utf8, tapez la commande suivante dans vim

:set fileencoding=utf-8

ou

:set fenc=utf8

Convertir pendant l’ouverture du fichier

:edit ++enc=koi8-r russe.txt

Convertir lors de l’écriture du fichier

:write ++enc=utf-8 russe.txt

Les types d’encodage supporté par vim

latin1 caractères 8-bits (ISO-8859-1)
iso-8859-N variante ISO-8859 (N = 2 à 15)
koi8-r russe
koi8-u ukrainien
8bit-{nom} n’importe quel encodage 8-bits (nom spécifique de Vim)
cp{nombre} MS-Windows : n’importe quelle page de codes mono-octet installée
cp932 japonais (Windows uniquement)
euc-jp japonais (Unix uniquement)
sjis japonais (Unix uniquement)
cp949 coréen (Unix et Windows)
euc-kr coréen (Unix uniquement)
cp936 chinois simplifié (Windows uniquement)
euc-cn chinois simplifié (Unix uniquement)
cp950 chinois classique (sur Unix, alias pour big5)
big5 chinois classique (sur Windows, alias pour cp950)
euc-tw chinois classique (Unix uniquement)
2byte-{nom} Unix : n’importe quel encodage sur deux octets (nom spécifique de Vim)
cp{nombre} MS-Windows : n’importe quelle page de codes sur deux octets installée
utf-8 Unicode UTF-8 encodé sur 32 bits (ISO/IEC 10646-1)
ucs-2 Unicode UCS-2 encodé sur 16 bits (ISO/IEC 10646-1)
ucs-2le comme ucs-2, en petit boutiste
utf-16 ucs-2 étendu avec des mots doubles pour plus de caractères
utf-16le comme utf-16, en petit boutiste
ucs-4 Unicode UCS-4 encodé sur 32 bits (ISO/IEC 10646-1)
ucs-4le comme ucs-4, en petit boutiste

Script pour réencoder les fichiers d'un site web

Ce script permet d’encoder des fichiers en utf8.
Modifiez les variables chemin et extension suivant ce que vous voulez faire.
Rendez exécutable le script avec chmod +x encode_utf8.bash
Puis lancez le ./encode_utf8.bash

Le script va analyser tous les fichiers du répertoire et des sous répertoire que vous avez spécifié.
Si l’encodage est iso-8859-1, la commande recode encode le fichier en utf8.
Si l’encodage est utf-8, rien n’est fait.
Si l’encodage est différent, le script vous demandera si vous voulez tenter d’encoder le fichier en utf-8.

D’après mes tests, certains fichiers apparaissent en us-ascii et je ne suis pas parvenu à les encoder en utf-8 mais ces fichiers ne semblent pas poser de problèmes.

encode_utf8.bash
#!/bin/bash
 
# Renseigner le répertoire à traiter
chemin="/var/www/siteweb/"
extension="php|html|css|js"
 
atraiter=`/usr/bin/find $chemin -regextype posix-extended -type f -iregex '.*\.('${extension}')$'`
 
for i in $atraiter
do
        enc=`file --mime-encoding $i | awk '{ print $2 }'`
        if [ $enc = "iso-8859-1" ] ; then
                recode $enc..utf-8 $i
                echo -e "$i \\033[1;32m Conversion effectuée \\033[0;39m"
        elif [ $enc = "utf-8" ] ; then
                echo -e "$i \\033[1;36m Déjà en utf8 \\033[0;39m"
        else
                echo -e "\\033[1;31m /!\\ \\033[0;39m $i\nEncodage: $enc"
                PS3="> L'encodage de ce fichier n'est pas standard, voulez vous essayer de le convertir quand même en UTF8 ?"   # le prompt
                LISTE=("[o] oui" "[n]  non")  # liste de choix disponibles
                select CHOIX in "${LISTE[@]}" ; do
                    case $REPLY in
                        1|o)
                        recode $enc..utf-8 $i
                        echo -e "\\033[1;32m Conversion effectuée \\033[0;39m"
                        break
                        ;;
                        2|n)
                        echo Aucun réencodage de fait.
                        break
                        ;;
                    esac
                done
        fi
done
 
echo

Mysql

Soit vous réencodé toute la base comme détaillé sur ce site http://docs.moodle.org/19/fr/Convertir_votre_base_MySQL_en_UTF-8

Soit vous faite la méthode comme moi qui consite à rajouter la ligne

mysql_query("SET NAMES 'utf8'");

Dans votre fichier de connexion à la base.

Réencoder des noms de fichiers avec des caractères bizarre

L’utilitaire qui va bien est detox

Le plus simple, mettez dans un répertoire tous les avec des caractères bizarre et lancez la commande

detox *

Le nom de vos fichiers sera lisible ;)

Plein d’options dans le man http://linux.die.net/man/1/detox

Caractères problématiques

Certains caractères issue de traitement de texte ou de système d’exploitation genre MacOS génère des caractères qui font planter les manipulations d’insertion de données dans des bases de données genre postgresql..

Bref, il faut alors faire des rechercher/remplacer sur ces caractères spécifiques.

Caractères spéciaux courant à rechercher

«

»

On peut aussi afficher le caractère dans postgresql avec la requête

select convert_from('\xe280a6'::bytea, 'utf-8');

si vous avez une vieille version

select convert_from(E'\xe2\x80\xa6'::bytea, 'utf-8');