数据源Shapefile本身的字符编码问题。由于Shapefile原始是GBK的编码,而ArcGIS从10.2.2版本开始,默认字符编码是utf8。
ArcGIS for Server进行Label绘制或属性查询时,会先读取数据源中是否包含cpg文件;如果没有,则会读取注册表中ArcGIS for Server账户下的代码页;如果还是未获取,则会直接采纳utf8作为字符编码。因此,当shapefile实际字符编码是GBK,且未包含cpg文件,注册表中也未添加这一信息时,就会导致乱码。
ArcMap中乱码解决方法
- 通过在注册表中导航到计算机 > HKEY_CURRENT_USER > Software > ESRI > Desktop10.3,依次新建项Common,项CodePage,字符串值dbfDefault,设置键值为oem(或936),并重启ArcMap,从而完美地解决了ArcMap端的显示问题。
Server中乱码解决方法
方法一:我们确实可通过将shapefile导入file geodatabase而后重新加载以绕开这一问题。
方法二:当服务执行ExportMap操作时,服务进程将读取*.cpg文件和注册表项 HKU\S-1-5-21-3961182117-3494339963-1454951688-1002\SOFTWARE\ESRI\Server10.3\Common\CodePage。由此可推测Server端编码的获取将分为两个步骤,首先,读取随数据存储的cpg文件以获取编码信息;当检测到cpg不存在时,则读取 HKU\S-1-5-21-3961182117-3494339963-1454951688-1002\SOFTWARE\ESRI\Server10.3 下的CodePage。对于当前数据而言,cpg文件必然是不存在的。通过检查,此处所指向的CodePage也是不存在的。因此,为了解决这一问题,依次导航到HKU即 HKEY_USERS > S-1-5-21-3961182117-3494339963-1454951688-1002 >Software > ESRI > Server10.3,新增Common项,CodePage项,以及字符串值dbfDefault,并将键值设置为oem。
重启ArcGIS for Server
为什么CodePage信息会存储在HKEY_USERS下的S-1-5-21-3961182117-3494339963-1454951688-1002中呢?利用PsGetsid进行检测,发现-1-5-21-3961182117-3494339963-1454951688-1002实质对应的就是ArcGIS for Server账户arcgis。
综上,简言之,ArcGIS for Server字符编码的获取将受限于其账户arcgis的字符编码的设置。也就是说,实质是在用户环境变量中设置这一字符编码并确保其生效。
参考:
中文Label乱码
Shapefile与字符集编码设置之ArcGIS for Server
shapefile与字符集编码设置