关于Shapefile乱码问题

【问题】:
在10.2.1、10.3版本读取10.2及之前版本ArcGIS创建的Shapefile,属性表中的汉字会出现乱码,该如何解决?

【原因】:
这个问题的根本原因就是读取文件使用的编码类型和文件实际存储的编码类型不一致。

【解决方法】:
ArcGIS 10.2.1之前版本,Shapefile根据Locale进行编码,可以直接按照dbfDefault设置方法到注册表中修改。
设置方法请参考:http://zhihu.esrichina.com.cn/article/79

ArcGIS 10.2.1及之后版本,Shapefile采用的是utf-8编码,在shapefile子文件旁边创建个记事本,修改为同名的CPG文件,文本内容oem或者936。
设置方法请参考:http://zhihu.esrichina.com.cn/article/32

【注意】:
ArcGIS Desktop 10.2.1 和 10.2.2 版本下修改编码行为,需要先打补丁,然后再按照dbfDefault设置方法到注册表中修改。

10.2.1补丁包:
http://support.esri.com/en/downloads/patches-servicepacks/view/productid/160/metaid/2090
10.2.2补丁包:
http://support.esri.com/en/downloads/patches-servicepacks/view/productid/67/metaid/2089

【备注】:

  • ArcGIS会先读取DBF头文件LDID中的编码,然后是CPG文件,最后是CodePage。
  • 如果不知道Shapefile的编码类型,可以使用程序检测(http://zhihu.esrichina.com.cn/article/32),通过ID,查询编码表中的编码进行对应。如果ID没有在编码表中,那么无法确定Shapefile使用的是什么编码,只能靠猜,猜对概率不大。

【扩展阅读】:

浅谈文字编码和Unicode
http://www.fmddlmyy.cn/text16.html
http://www.fmddlmyy.cn/text17.html

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
http://www.fmddlmyy.cn/text6.html

谈谈Windows程序中的字符编码
http://www.fmddlmyy.cn/text7.html

要解决GDAL读取Shapefile文件后输出中文乱码问题,可以通过设置合适的编码来处理。下面是一个示例代码,演示如何使用GDAL读取Shapefile文件并正确处理中文字符: ```python from osgeo import ogr # 打开Shapefile dataset = ogr.Open('input_shapefile.shp', 0) layer = dataset.GetLayer() # 获取属性表编码 layer_encoding = layer.GetLayerDefn().GetFieldDefn(0).GetEncoding() # 设置输出编码 output_encoding = 'utf-8' # 遍历要素并输出属性值 for feature in layer: for i in range(feature.GetFieldCount()): field_value = feature.GetField(i) # 解码属性值为Unicode字符串 field_value_unicode = field_value.decode(layer_encoding) # 编码为指定输出编码的字符串 field_value_encoded = field_value_unicode.encode(output_encoding) # 输出属性值 print(field_value_encoded) # 关闭数据集 dataset = None ``` 在上述代码中,我们首先通过`GetLayerDefn()`方法获取属性表的编码,并将其保存在`layer_encoding`变量中。然后,我们将输出编码设置为`utf-8`,可以根据需要修改为其他编码。接下来,我们遍历要素并使用`decode()`方法将属性值解码为Unicode字符串,然后使用`encode()`方法将其编码为指定的输出编码字符串。最后,我们使用`print()`语句输出属性值。 请将`input_shapefile.shp`替换为您要读取的Shapefile文件路径。如果您的Shapefile文件使用了其他编码,请在`layer.GetLayerDefn().GetFieldDefn(0).GetEncoding()`中指定正确的编码。 希望这可以解决您的问题!如果您有任何进一步的疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值