在MapServer中显示国际字符

作者

Jeff McKenna

接触

jmckenna at gatewaygeomatics.com

最后更新

2020-01-17

信用

最初的功能被添加到MapServer4.4.0中,作为日本信息技术促进局(IPA)赞助的项目的一部分。项目成员包括:Venkatesh Raghavan、Masumoto Shinji、Nonogaki Susumu、Nemoto Tatsuya、Hirai Naoki(日本大阪城市大学)、Mario Basa、Hagiwara Akira、Niwa Makoto、Mori Toru(日本奥克尼公司)和Hattori Norihiro(日本电子解决方案服务公司)。

要求

  • mapserver版本为大于或等于4.4.0(对于mapserver>=7.0,层级编码)

  • 使用libiconv库编译的mapserver

如何在 Mapfile 中启用(mapserver>=7.0)

MapServer 7.0版本包含MapServer处理编码方式的更改;7.0中的新内容是在 LAYER 水平。这使得在同一个 Mapfile 中,在不同的编码中管理多个层变得更加容易。这种变化的原因是数据集的编码不仅影响标签,还影响整个层。MapServer7还将在后台将任何字符串转换为utf8,并且将以utf8返回任何输出(例如通过ogc getcapabilities、getfeature或查询)。

Mapfile LAYER 对象的 ENCODING 参数接受编码名称作为其参数。

MAPServer使用GNU libiconv 处理编码的库。libiconv网站具有支持的编码列表。还可以在安装了libiconv的系统上使用“iconv-l”命令,以获取该特定系统上支持的编码的完整列表。

注解

标签对象的 ENCODING 参数已弃用,但在该场景中仍存在一些逻辑来处理在MapServer 7中使用的情况。

步骤1:验证ICONV支持和MapServer版本

执行 mapserv -v 在命令行中,验证您的MapServer版本>=7.0及其包含 SUPPORTS=ICONV ,例如:

> mapserv -v

  MapServer version 7.0.1 (MS4W 3.1.3) OUTPUT=PNG OUTPUT=JPEG
  OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO
  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
  INPUT=JPEG INPUT=POSTGIS INPUT=ORACLESPATIAL INPUT=OGR INPUT=GDAL
  INPUT=SHAPEFILE

步骤2:验证ICONV是否支持文件的编码

由于MapServer使用libiconv库来处理编码,您可以在以下位置查看支持的编码列表:http://www.gnu.org/software/libiconv/

Unix用户也可以使用 iconv -l 安装libiconv的系统上的命令,以获取该特定系统上支持的编码的完整列表。

步骤3:向层对象添加编码参数

现在,您只需将编码参数添加到mapfile层对象中,例如:

MAP
 ...
 LAYER
   ...
   ENCODING "SHIFT_JIS"
   CLASS
     ...
   END #class
 END #layer
END #map

注解

确保在文本编辑器中以“utf-8”编码保存 Mapfile 。

LAYER
  NAME "地名"
  DATA "chimei.shp"
  STATUS DEFAULT
  TYPE POINT

  ENCODING "SHIFT_JIS"
  LABELITEM "NAMAE"

  CLASS
    NAME "地名"
    STYLE
      COLOR 10 100 100
    END
    LABEL
      TYPE TRUETYPE
      FONT "pgothic"
      COLOR 220 20 20
      SIZE 7
      POSITION CL
      PARTIALS FALSE
      BUFFER 3
    END
  END
END

如何在 Mapfile 中启用(mapserver<7.0)

旧版MapServer只允许在 LABEL Mapfile 中的级别。

向标签对象添加编码参数

将encoding参数添加到mapfile label对象,例如:

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

下面是使用标签级别的编码集的示例层:

LAYER
  NAME "chimei"
  DATA "chimei.shp"
  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

使用php mapscript的示例

对于php mapscript, Encoding 参数包含在labelobj类中(对于mapserver<7),因此可以修改层的编码参数,例如:

// 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");

笔记

注解

在最初的实现过程中,使用不同的日本编码系统(shift-jis、euc-jp、utf-8以及泰国的tis-620编码系统)测试了该功能。

libiconv支持的拉丁字母编码示例有以下这些:ISO-8859-1(拉丁字母1-也称为拉丁-1-西欧语言)、ISO-8859-2(拉丁字母2-也称为拉丁-2-东欧语言)、CP1252(Microsoft Windows拉丁字母编码-英语和其他一些西欧语言)。