Ce DBF a un drôle d’accent é Ù

Que celui qui n’a jamais eu de problème avec l’encodage en général nous donne son secret… Prenons le cas des problèmes d’encodage (encoding) lors de l’import du DBF (ShapeFile) dans PostGIS / PostgreSQL avec la commande shp2pgsql.

Tentative d’historique

Chacun y va de son petit nom, plus ou moins chargé d’histoire bien avant l’aire du web et des SIG. Entre officiel, alias, abus de langage, Anglais, Français, International et DOS, Windows, Unix… pas facile de suivre.

En France on retrouve plusieurs page de code :

  • ASCII la norme la plus connue, la plus ancienne et la plus largement compatible à la base de nombreuses autres normes… mais seulement 128 caractères !
  • CP850 (définie par IBM, utilisé par DOS) encore utilisé par la console Windows.
  • Windows-1252 (CP1252) aussi appelé ANSI à tort. Il remplace le CP850. C’est une extension de l’ISO-8859-1.
  • ISO_8859-1 ou Latin1 utilisé sous Unix ou Windows est la 1ere partie de la norme de l’Organisation Internationale de Normalisation (International Organization for Standardization).
  • ISO_8859-15 ou Latin9 est « une mise à jour » de l’ISO_8859-1 avec l’ajout de € et œ.
  • UTF-8 est un « format de transformation » de la norme ISO 10646 fondement de l’Unicode. C’est l’un des standard d’Internet et tout le monde devrait l’utiliser pour ne pas avoir de problèmes…

Détecter l’encodage

Le DBF du Shapefile utilise une page de code. Malheureusement ce code est rarement enregistré dans le fichier et il est donc difficile de l’identifier. Le problème se pose sous Windows où on retrouve 2 encodages, le Windows-1252 et le CP850.

Le système D sous Windows avec Excel :

  • le ‘é’ s’affiche ‘é’ le DBF est en CP850. Si quelqu’un peut m’expliquer le pourquoi je suis preneur. Avec Office 2007, Windows 7 sur du NTFS comment le CP850 est le code page par défaut !
  • le ‘é’ s’affiche ‘Ú’ et le ‘è’ s’affiche ‘Þ’ le DBF est en Windows-1252.

La méthode empirique bis avec DBF Commander (disponible ici) :

  • Ouvrir le DBF
  • Dans le menu choisir : Tools > Set Code Page…
  • Sélectionner un code page qui affiche correctement les caractères (Par défaut sur Unknown car le code page n’est pas enregistré dans le DBF).
  • Si le DBF est en UTF-8 il faudra d’abord passer par : File > Convert to… > UTF-8 -> ANSI

NOTE : QGis permet de spécifier l’encodage du fichier à l’ouverture et donc de valider aussi son code page. On peut le changer si besoin (avec DBF Commander aussi).
OpenOffice permet aussi de mieux gérer l’encodage du fichier.

Importer le DBF ou Shapefile dans PostGIS

Une fois le code page identifié l’import DBF se fait via la commande shp2pgsql. La commande encode le fichier en UTF-8 afin de l’importer plus facilement quelque soit l’encodage de la base de destination (Latin1, UTF-8 …). Il faut préciser l’encodage d’origine avec l’option « -W <encoding> » qui accepte les paramètres de la librairie libiconv utilisée pour la conversion (Ne pas confondre avec les jeux de caractères supportés par PostgreSQL).

shp2pgsql -d -D -W CP850 -n <filename>.dbf <table_name> | psql -U postgres -d <db_name>
shp2pgsql -d -D -W CP1252 -n <filename>.dbf <table_name> | psql -U postgres -d <db_name>

Si le DBF est déjà en UTF-8 l’option « -W » est inutile.

NOTE : Par défaut la console Windows utilise l’encodage CP850. Avec le client « psql » le message suivant peut apparaître :

Warning: Console code page (850) differs from Windows code page (1252)
         8-bit characters may not work correctly. See psql reference
         page "Notes for Windows users" for details.

Pour activer le page de code 1252 on peut créer un raccourci avec l’option suivante :

C:\WINNT\system32\cmd.exe /k chcp 1252

 

Conclusion

Passez à Linux en UTF-8 mais bon c’est plus facile à dire qu’à faire. Sinon sous Windows ne pas oublier l’encodage CP850 qui résiste encore et sème le trouble…

 

Memo

Si la page affiche des caractères de ce type : « Ã© », « Ã® », « Ã », …
> Les données ont été enregistrées au format UTF-8, et le navigateur les affiche en pensant avoir affaire à de l’ISO.

Si la page affiche des caractères de ce type : « � »
> Les données ont été enregistrées au format ISO, et le navigateur les affiche en pensant avoir affaire à de l’UTF-8.

Elle fait combien ta base ?

Pour connaitre rapidement la taille sur le disque d’une base de données PostgreSQL ou PostGIS voici une commande simple :

SELECT pg_size_pretty(pg_database_size('database_name'));

On peut aussi obtenir la taille sur le disque d’une table en particulier :

SELECT pg_size_pretty(pg_total_relation_size('table_name'));

 

Sources :15 Practical PostgreSQL Database Administration Commands