在MapServer中显示国际字符¶
- 作者
杰夫麦克纳
- 联系
jmckenna在gatewaygeomatics.com
- 最后更新
2020-10-28
目录
信用卡¶
最初的功能被添加到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)
MapServer使用 libiconv 类库
如何在映射文件中启用(mapserver>=7.0)¶
MapServer 7.0版本包含MapServer处理编码方式的更改;7.0中的新内容是在 LAYER 水平。这使得在同一个映射文件中,在不同的编码中管理多个层变得更加容易。这种变化的原因是数据集的编码不仅影响标签,还影响整个层。MapServer7还将在后台将任何字符串转换为utf8,并且将以utf8返回任何输出(例如通过ogc getcapabilities、getfeature或查询)。
Mapfile LAYER 对象的 ENCODING 参数接受编码名称作为其参数。
地图服务器使用GNU libiconv 库来处理编码。Libiconv网站上有一个受支持的编码列表。用户还可以在安装了libiconv的系统上使用“iconv-l”命令,以获取该特定系统上支持的编码的完整列表。
备注
标签对象的 ENCODING 参数已弃用,但在该场景中仍存在一些逻辑来处理在MapServer 7中使用的情况。
步骤1:验证ICONV支持和MapServer版本¶
执行 mapserv -v 在命令行中,验证您的MapServer版本>=7.0及其包含 SUPPORTS=ICONV ,例如:
> mapserv -v
MapServer version 7.7.0-dev (MS4W 4.0.4) OUTPUT=PNG OUTPUT=JPEG
OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE
SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS SUPPORTS=SVGCAIRO
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=POINT_Z_M SUPPORTS=PBF
INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
步骤2:验证ICONV是否支持文件的编码¶
由于MapServer使用libicv库来处理编码,因此您可以在此处查看支持的编码列表:https://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”编码保存映射文件。
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
备注
MapServer 7.6.0版本包括一个重要的修复程序,允许在文件名和映射文件中的路径中使用特殊字符,如“ä”(元音)。
步骤4:使用shp2img实用程序进行测试¶
如何在映射文件中启用(mapserver<7.0)¶
旧版MapServer只允许在 LABEL 映射文件中的级别。
向标签对象添加编码参数¶
将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拉丁字母编码-英语和其他一些西欧语言)。