在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(日本电子解决方案服务公司)。
如何在 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");