Affichage des caractères internationaux dans MapServer

Author:Jeff McKenna
Contact:jmckenna at gatewaygeomatics.com
Last Updated:2011-08-29

Credit

La fonctionnalité suivante a été ajoutée à MapServer 4.4.0 dans le cadre d’une partie de projet sponsorisé par l‘“Information-technology Promotion Agency” (IPA), au Japon. Les membres du projet incluaient : Venkatesh Raghavan, Masumoto Shinji, Nonogaki Susumu, Nemoto Tatsuya, Hirai Naoki (Université de la ville d’Osaka, Japon), Mario Basa, Hagiwara Akira, Niwa Makoto, Mori Toru (Orkney Inc., Japon), et Hattori Norihiro (E-Solution Service, Inc., Japon).

Prérequis

  • MapServer >= 4.4.0
  • MapServer compilé avec la bibliothèque libiconv

Comment l’activer dans votre mapfile

Le paramètre de l’objet LABEL du mapfile nommé ENCODING peut être utilisé pour convertir les chaînes de leur système d’encodage original dans un qui puisse être compris par les polices de type True Type. Le paramètre ENCODING accepte le nom d’encodage comme étant son paramètre.

MapServer uses GNU’s libiconv library ( http://www.gnu.org/software/libiconv/ ) to deal with encodings. The libiconv web site has a list of supported encodings. One can also use the “iconv -l” command on a system with libiconv installed to get the complete list of supported encodings on that specific system.

Ainsi, théoriquement, chaque chaîne avec un sytème d’encodage supporté par libiconv peut être affichée comme une étiquette dans MapServer aussi longtemps que le jeu de polices correspondant est disponible.

Etape 1 : vérifier le support de ICONV et la version de MapServer

Exécuter ‘mapserv -v’ dans votre ligne de commande, et vérifier que votre version de Mapserver est >= 4.4.0 et inclut ‘SUPPORTS=ICONV’, comme ceci :

> mapserv -v

  MapServer version 5.6.5 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG
  OUTPUT=WBMP OUTPUT=PDF OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ
  SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=ICONV SUPPORTS=FRIBIDI
  SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER
  SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER
  SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=RGBA_PNG
  SUPPORTS=TILECACHE INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL
  INPUT=SHAPEFILE

Etape 2 : vérifier que vos encodages de fichiers sont supportés par ICONV

Comme MapServer utilise la bibliothèque libiconv pour gérer les encodages, vous pouvez vérifier la liste des encodages supportés ici : http://www.gnu.org/software/libiconv/

Les utilisateurs Unix peuvent aussi utiliser la commande iconv -l sur un système avec libiconv installé pour obtenir la liste complète des encodages supportés sur ce système en particulier.

Etape 3 : ajouter le paramètre ENCODING à votre objet LABEL

Maintenant, vous pouvez simplement ajouter le paramètre ENCODING dans votre objet de mapfile LAYER, comme ceci :

MAP
 ...
 LAYER
   ...
   CLASS
     ...
     LABEL
       ...
       ENCODING "SHIFT_JIS"
     END
   END
 END
END

Un des bénéfices d’avoir un paramètre “ENCODING” à l’intérieur de l’objet LABEL est que des LAYERS différentes avec des systèmes d’encodage différents peuvent être combinées ensemble et affichées dans une seule et même carte. Par exemple, les étiquettes pour une couche utilisant un Shapefile comme source qui contient des attributs en SHIFT-JIS peuvent être combinéees avec une couche provenant d’un serveur de base de données PostGIS avec des attributs EUC-JP. Un mapfile type peut ressembler à ceci :

LAYER
  NAME "chimei"
  DATA chimei
  STATUS DEFAULT
  TYPE POINT
  LABELITEM "NAMAE"
  CLASS
    NAME "CHIMEI"
    STYLE
      COLOR 10 100 100
    END
    LABEL
      TYPE TRUETYPE
      FONT kochi-gothic
      COLOR 220 20 20
      SIZE 10
      POSITION CL
      PARTIALS FALSE
      BUFFER 0
      ENCODING SHIFT_JIS
    END
  END
END

LAYER
  NAME "chimeipg"
  CONNECTION "user=username password=password dbname=gis host=localhost port=5432"
  CONNECTIONTYPE postgis
  DATA "the_geom from chimei"
  STATUS DEFAULT
  TYPE POINT
  LABELITEM "NAMAE"
  CLASS
    NAME "CHIMEI PG"
    STYLE
      COLOR 10 100 100
    END
    LABEL
      TYPE TRUETYPE
      FONT kochi-mincho
      COLOR 20 220 20
      SIZE 10
      POSITION CL
      PARTIALS FALSE
      BUFFER 0
      ENCODING EUC-JP
    END
  END
END

Exemple utilisant PHP MapScript

Pour le PHP Mapscript, le paramètre Encoding est inclus dans la Class de l’objet LabelObj, ainsi le paramètre d’encodage d’une couche peut être modifié comme ceci :

// Loading the php_mapscript library
dl("php_mapscript.so");

// Loading the map file
$map = ms_newMapObj("example.map");

// get the desired layer
$layer = $map->getLayerByName("chimei");

// get the layer's class object
$class = $layer->getClass(0);

// get the class object's label object
$clabel= $class->label;

// get encoding parameter
$encode_str = $clabel->encoding;
print "Encoding = ".$encode_str."\n";

// set encoding parameter
$clabel->set("encoding","UTF-8");

Remarques

Note

Pendant l’implémentation initiale, cette fonctionnalité a été testée en utilisant les différents encodages systèmes japonais : Shift-JIS, EUC-JP, UTF-8, aussi bien le système d’encodage Thai TIS-620.

Des exemples d’encodage pour l’alphabet latin supportés par libiconv sont : ISO-8859-1 (Alphabet Latin No. 1 - connu aussi sous le nom LATIN-1 - langages de l’Europe de l’Ouest), ISO-8859-2 (Alphabet Latin No. 2 - connu aussi comme LATIN-2 - langages de l’Europe de l’Est), CP1252 (encodage de l’alphabet Latin Microsoft Windows - Anglais et certains langages de l’Europe de l’Ouest).