为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法如下
为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?低版本中不是至少可以存储4个汉字吗?
原因
这个问题仍然与编码类型有关。
ArcGIS 10.2 以及更早的版本,ArcGIS写shapefile的时候,遇到中文默认使用Windows当前语言 字符集编码(也称 代码页/CodePage/OEM CodePage),例如中文一般使用的是 CodePage 936(GBK)。
ArcGIS 10.2.1 以及之后的版本,ArcGIS写shapefile的时候,默认使用的是 UTF-8 编码类型。
这两种编码类型存储汉字所使用的字节数是不相同的,上面的关键字中我也给出了 wiki 的链接,有兴趣点进去看看详情。简言之,shapefile自身的限制是字段为9个字节,CP936编码下汉字通常为双字节存储,因此可以存储 9/2=4 个汉字;UTF-8 编码下汉字至少需要3个字节存储,因此最多只能存储 9/3=3 个汉字了。
<ignore_js_op>
举个例子,在Python命令行中,我们求一下 Unicode字符串的长度就可以真相大白。
<ignore_js_op>
解决方法
Perfect Solution:
使用地理数据库,放弃shapefile,避免各种截断问题,这也是存储地理数据的康庄大道。
但是,shapefile的拥趸说“我的需求是恢复以前存储4个汉字的shapefile,我不想用地理数据库,我希望得到老版本的shapefile的结果,我不在乎shapefile的编码类型是什么 ……bla bla……”好吧,方法还是有的。
Workaround:
这里还有个注意事项: 如果你用的刚好是 10.2.1 和10.2.2 这两个版本,那么要打补丁后以下设置才生效。以前写过另外一篇,详情点 这里。 如果你用的是 10.3.x ,那么直接向下进行。
1.打开注册表,定位到 ‘My Computer\HKEY_CURRENT_USER\Software\ESRI\Desktop 10.x’<li>创建项 ‘Common‘, 接着在其下创建 ‘CodePage’ 项, 添加 ‘字符串’,名称: dbfDefault,健值:oem(或者 936)。
<ignore_js_op>
这样ArcGIS Desktop 读、写 shapefile的默认方式就将是Windows当前语言 OEM CodePage 936。
PS: 当然这种方法,也可以解决第一个问题,并且不需要为缺失oem编码信息的数据增加cpg文件了。两种方法,任君选择。
===================================
操作方法:读写在不同代码页编码的 shapefile 和 dBASE 文件
摘要
Esri 在 ArcGIS for Desktop(ArcMap、ArcCatalog 和 ArcToolbox)中执行了一个“代码页转换”功能,该功能允许桌面应用程序读写在不同代码页编码的 shapefile 和 dBASE 文件。 可在系统注册表内指定代码页值,以激活 dBASE 文件的代码页转换功能(名为“dbfDefault”)。 此功能与 ArcInfo Workstation 中的 &CODEPAGE 功能十分相似。
ArcGIS 10.2.1 之前的版本,可使用以下程序设置所需的代码页行为。 如果安装了 ArcGIS for Desktop 10.2.1 或 10.2.2,在遵循以下说明前,请下载并安装知识库文章 42646 所描述的修补程序。
注:
在每个 shapefile (.DBF) 的标题中都包含了对某一代码页的引用。 ArcGIS 10.2.1 之前的版本,所用的代码页与用户的区域设置相对应。 例如,如果用户位于日本地区,则 .DBF 文件所使用的代码页将为 'Shft-JIS’。 在 ArcGIS 10.2.1 版本中,系统默认将 shapefile (.DBF) 中的代码页设置为 UTF-8 (UNICODE)。 这与现有的国际化活动相一致,并应保证数据可读。
常见问题解答
dbfDefault 设置有何用处?
在系统注册表内设置一个代码页值后,用户即可读写在该页中编码的 shapefile 和 dBASE 文件。 例如,用户可以在 OEM 中设置代码页注册表值,以导出在 OEM 中编码的 shapefile。 此外,用户还可读取文件中未存储代码页信息的 shapefile 和 dBASE 文件,前提是用户知道文件在哪个代码页中编码。
为什么要设置 dbfDefault?
在 ArcGIS Desktop 中打开 shapefile 和 dBASE 文件时,Desktop 程序会查看 dBASE 文件标题上的“语言驱动程序 ID”(LDID) 或者相关的 *.CPG 文件,以确定代码页并决定读取文件的哪个代码页。 如有必要,ArcGIS for Desktop 会基于检索到的代码页信息,通过代码页转换功能显示相应的字符串。 如果 dBASE 文件缺少 LDID 或者 .CPG 文件,则假设文件在 Windows (ANSI/Multi-byte) 代码页中编码。
如果 Desktop 程序读取在 OEM 中编码的 dBASE 文件,但文件中不包含任何代码页信息或不包含 LDID 或 CPG 文件,则字符无法正确显示。 这是因为 Desktop 程序无法找到代码页信息,所以假定文件是在 ANSI 代码页中编码的,而文件实际上是在 OEM 中编码的。 这表示 ArcGIS 将 OEM 文件视为在 ANSI 中编码,所以导致储存在文件中的 8 位字符显示不正确。
大多数 shapefile 和 dBASE 文件应将代码页信息存储在文件中。 Microsoft Access 2000 和 Excel 2000 等程序将 dBASE 文件编码于 OEM 中,但不包含 LDID 中的代码页信息,所以 ArcGIS 无法正确读取文件。 要避免此类问题,用户在打开缺少代码页信息的文件之前,可以为适当的代码页设置 dbfDefault。
dbfDefault 的工作原理是什么?
需要注意的是,有一种情况是例外:从 ArcCatalog 和 ArcToolbox 中的 coverage 导出的 shapefile,除了西班牙语和阿拉伯语的文件之外,都是在 OEM 中编码的,无论 dbfDefault 设置是什么。 这是因为 ArcToolbox 中的“将 coverage 转换为 shapefile”用作 ArcInfo Workstation 的功能,而后者定义的是 DOS 上运行的图层,因此输出文件总是在 OEM 代码页或 DOS 代码页中进行编码。 从 ArcCatalog 和 ArcToolbox 的 coverage 中导出的西班牙语和阿拉伯语的 shapefile 文件在 ANSI 中编码。 从 ArcCatalog 和 ArcToolbox 的 coverage 中导出的 shapefile 文件总是位于 OEM 代码页中(西班牙语文件除外)
同样的逻辑也适用于在 ArcGIS for Desktop 中读取的 shapefile 和 dBASE 文件;如果 shapefile 或 dBASE 文件缺少 LDID 或 .cpg 文件,ArcGIS 则假定要编码的文件位于 dbfDefault 定义的代码页中。 例如,如果 dbfDefault 值被设置为 OEM,而 dBASE 文件缺少 LDID 和 .cpg 文件,ArcGIS for Desktop 则假定文件是在 OEM 中编码的,因此执行代码页转换来显示 ArcMap 和 ArcCatalog 中的8位字符(因为这两个应用程序都是使用 ANSI 代码页来显示字符串的 Windows 程序)。
注:
如果用户将 dbfDefault 值设置为某个代码页,那么在 ArcGIS 中导出的所有 shapefile 和 dBASE 文件都将编码在该代码页中。 所有不具备代码页信息的 shapefile 和 dBASE 文件也都假定位于该代码页中。 因此,当任务完成时,将 dbfDefault 值设置回默认值(无值)十分重要。
dbfDefault 适用于哪些程序?
ArcGIS for Desktop 是唯一一个受到 dbfDefault 设置影响的程序。 其他程序(例如 ArcInfo Workstation 和 ArcView 3.x)或其他代码页设置(例如 ArcInfo Workstation 中的 '&CODEPAGE' 功能和 ArcView 3.x 中的“代码页配置文件”)都不受影响。
在 ArcInfo Workstation 中:
- 带有 &CODEPAGE OEM 的 ARCSHAPE 可在 OEM 中创建 shapefile
- 带有 &CODEPAGE ANSI 的 ARCSHAPE 可在 ANSI 创建 shapefile
- 带有 &CODEPAGE OEM 的 INFODBASE 可在 OEM 中创建 dBASE 文件
- 带有 &CODEPAGE ANSI 的 INFODBASE 可在 ANSI 中创建 dBASE 文件
在 ArcView 3.x 中:
- Shapefile 和 dBASE 文件保存在 ANSI 代码页中。
受 dbfDefault 影响的数据格式有哪些?
Shapefile 和 dBASE 文件是唯一可供 dbfDefault 设置用于指定代码页的数据格式。 其他数据格式,例如 coverage 和个人地理数据库,不会受到 dbfDefault 设置的影响。
在 ArcGIS for Desktop 中(无论 dbfDefault 设置如何):
- 个人地理数据库保存在 Unicode 中
- 个人地理数据库表保存在 Unicode 中
- coverage 保存在 ISO 代码页中
- INFO 文件保存在 ISO 代码页中
- 交换文件保存在 ANSI 代码页中
- 文本文件保存在 ANSI 代码页中
过程
给出的说明描述了如何在系统注册表中设置 dbfDefault 值。 下面列出两个选项。
警告:
下面的说明涉及更改操作系统的重要组成部分。 建议您先备份操作系统及文件(包括注册表),然后再继续操作。 必要时,请咨询合格的计算机系统专业人士。 您按照下列步骤进行操作期间,Esri 无法防止错误更改造成的结果;因此,请谨慎操作并自行承担风险。
选项 A
- 在系统注册表中添加两个名为“Common”和“CodePage”的项。
如需添加项:- 打开注册表编辑器:单击“开始”>“运行”,输入“regedit”,然后单击“确定”。
- 在注册表树中(位于注册表窗口左侧窗格中),转至“My Computer\HKEY_CURRENT_USER\Software\ESRI”,然后单击注册表项,“Desktop 10.x”。 对于 Pro,单击注册表项“Pro1.0”。 (对于 9.3.1 版本或更早版本,转至“My Computer\HKEY_CURRENT_USER\Software', and click the registry key ESRI”。)
- 添加一个名为 Commom 的新项(在“编辑”菜单中:
导航到“新建”,选择“项”,输入名称“Common”,并按 Enter 键)。 - 单击刚刚创建的注册表项(公共),并添加一个名为“CodePage”的新项。
- 将一个新的字符串值“dbfDefault”添加到 CodePage 项中。
添加字符串值:- 单击“CodePage”项。
- 在“编辑”菜单中,导航到“新建”,然后选择“字符串值”。
- 键入'dbfDefault’作为新的值,并按“ENTER”键。
新的“CodePage”项应如下显示:
- 输入一个代码页值。
- 选择刚刚添加的条目;重要的是选择 dbfDefault,而不是 (Default)。
- 在“编辑”菜单中,单击”修改”。
- 在“值”数据中,键入新的代码页值,并单击“确定”。
下表所示为支持的代码页标识符(不区分大小写)。
- OEM 代码页标识符
437 - 美国
708 - 阿拉伯语 (ASMO 708)
720 - 阿拉伯语 (Transparent ASMO),阿拉伯语 (DOS)
737 - 希腊语,希腊语 (DOS)
775 - 波罗的海语,波罗的海语 (DOS)
850 - 多语言拉丁语 1,西欧语言 (DOS)
852 - 拉丁语 2,中欧语言 (DOS)
855 - 西里尔语
857 - 土耳其语,土耳其语 (DOS)
860 - 葡萄牙语,葡萄牙语 (DOS)
861 - 冰岛语,冰岛语 (DOS)
862 - 希伯来语,希伯来语 (DOS)
863 - 加拿大法语,加拿大法语 (DOS)
864 - 阿拉伯语,阿拉伯语 (864)
865 - 北欧语言,北欧语言 (DOS)
866 - 俄语,西里尔语 (DOS)
869 - 现代希腊语,现代希腊语 (DOS)
932 - 日语,日语 (Shift-JIS)
936 - 中文(简体):中华人民共和国,新加坡
949 - 韩语(统一的韩语代码)
950 - 繁体中文:台湾,香港,中华人民共和国
ALARABI - 将代码页设置为 448
- ANSI 代码页标识符
1250 - 中欧语言
1251 - 西里尔语
1252 - 西欧语言
1253 - 希腊语
1254 - 土耳其语
1255 - 希伯来语
1256 - 阿拉伯语
1257 - 波罗的海语
1258 - 越南语
Big5 - 汉语:台湾、香港、澳门
SJIS - 日语(将代码页设置为 932)
- ISO 代码页标识符
88591 - 拉丁语 1:西欧语言
88592 - 拉丁语 2:中欧和东欧语言
88593 - 拉丁语 3:南欧语言
88594 - 拉丁语 4:北欧语言
88595 - 西里尔语
88596 - 阿拉伯语
88597 - 希腊语
88598 - 希伯来语
88599 - 拉丁语 5:土耳其语
885910 - 拉丁语 6:北欧语言
885911 - 泰语
885913 - 立陶宛语
885915 - 拉丁语 9:西欧语言(拉丁语 1 升级版)
- Unicode 值
UTF-8 - 将代码页设置为 65001
UTF8 - 将代码页设置为 65001
注:
现在 Shapefile 可储存至 UTF-8。 然而,仅 ArcGIS for Desktop 可识别以 UTF-8 编码的 shapefile。
选项 B
或者,用批处理文件修改 Windows 注册表。
- 在记事本中,使用以下编码创建文件 ChangeCodePage.bat:
编码:
@ECHO OFF
IF "%1"=="" GOTO :EOF
reg add HKEY_CURRENT_USER\Software\ESRI\Desktop10.3\Common\CodePage /v dbfDefault /t REG_SZ /d %1 /f注:
更改路径,以匹配要修改的系统上的 ArcGIS 版本,例如,\Desktop10.1)。 - 将文件保存到要修改的计算机上的某个位置。
- 打开命令提示符窗口(可能需要“以管理员身份运行”以执行批处理文件)。
- 要执行批处理文件(在本例中,将代码页更改为日语),请导航到批处理文件所在位置并运行以下命令:
ChangeCodePage SJIS
此时注册表项已完成创建,且代码页已设置为 SJIS。
为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法如下的更多相关文章
- c#关于int(或其他类型)的字段在对象初始化时默认初始化问题的解决方法
问题: c#的wcf服务接口在后台通过自定义对象接收前台参数的时候,前台参数即使不传int类型的字段值,后台也会默认初始化为0,由于很多表示状态的int字段都是从0开始的,导致查询的时候有些不想参与查 ...
- ARCGIS 10中添加excel点字段生产点shp文件的工具
菜单栏中——文件——添加数据——添加XY数据——选择excel。 选择x,y和投影(注意这里投影应该是原数据的本身投影,不能直接选择你要转换的投影)完成。
- ArcGis安装失败提示“需要Microsoft .NET Framework 3.5 sp1或等效环境”的解决方法
这个问题一般出现在Win8或者Win10系统上,因为系统默认没有启用该.Net Framework. 下载Microsoft .NET Framework 3.5 sp1安装后再开始安装ArcGis. ...
- sqlserver text类型字段错误 net.sourceforge.jtds.jdbc.ClobImpl@66fa192的解决方法
1. SqlServer数据库中text/ntext字段,在用jtds1.2驱动时,会出现用getString()取不到值的问题,toString()也不行. 昨天查了下帮助可以通过简单的配置解决.即 ...
- C#导出Excel文件,过长数值显示为科学计数法解决方法 C#
C#导出EXCEL文件,身份证号码或某些ID内容长度超过15个数字,这样导出的Excel文件中默认情况下将这个值以科学计数方式显示,下面提供两种解决方式:1.在转出的内容前,加上一个TAB符号,C# ...
- WIN 10系统下,在DOS窗口输入Java或者javac出现乱码的解决方法
昨天在WIN10系统下完成了Java环境的安装配置,配置完成后验证环境的时候出了一个小插曲—输入java后窗口内中文字符出现乱码,如下图. 在经过一番google之后,发现,原来是我cmd窗口的代码页 ...
- ArcGIS 10.2 for Server 集群部署
ArcGIS 10.2 for Server 具有很灵活的体系结构,而 ArcGIS 10.2 forServer site 可以包含一台或多台安装 GIS Server 的机器,这些参与ArcGI ...
- 【ArcGIS 10.2新特性】Geodatabase 10.2 常见问题
地理数据库技术一直以来都是ArcGIS的基础技术.为充分使用ArcGIS的全部功能则需要把数据存储在Geodatabase当中.Geodatabase是一个综合性的信息模型,它可以支持存储几乎任意类型 ...
- ArcGIS 10.6 安装破解教程
美国时间2018年1月17日,ArcGIS 10.6正式面向用户发布!10.6带来更完善的产品体系框架,同时全面拥抱前沿IT技术,升级平台大数据.三维.影像等核心能力,为我们打造了一个功能强大,性 ...
随机推荐
- Oracle数据的导入与导出
本文针对window操作系统与oracle12C的版本. 1.sqlplus执行单个sql文件 1.执行sqlplus登陆命令:sqlplus username/password@host:port/ ...
- Ubuntu apt-get锁定问题
- 【OF框架】使用OF框架创建应用项目
开始:准备工作 开发环境已经安装Visual Studio,包含Web开发负载.Python开发负载.NodeJs开发负载 开发环境已经安装Visual Studio Code 开发环境已经安装Nod ...
- 【蜂窝】at+qcfg="band"的计算和使用
查询附件 Quectel_EC25_LTE_模块产品规格书_V1.6 可知当前的蜂窝模块所对应的band频带是什么? eg.1 EC25-AU 当前选择4G 优先, FDD LTE 可看手册QCFG命 ...
- Android中sp和px之间关系探究
记得当时在刚接触Android时都在说不要用px,要用sp,所以在实际工作当中当然就按照这个规则,所以都要将px换算成sp,而我在实际工作中的换算规则是dp=px * 1.5,而且用这种规则到现在基本 ...
- linux网络编程之system v信号量(二)
今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...
- c++ 流对象之streambuf(可当做缓冲区使用)
在C++ 中引入了流的概念,我们很方便的通过流来读写文本数据和二进制数据,那么流对象的数据究竟是怎么存储的呢,为了搞清这个问题,先来看一看c++ 的 io 体系: 由图可以看出,在stream 的实现 ...
- /tmp/supervisor.sock no such file 报错
背景: 在执行 supervisorctl 时,报了这么一个错(如图),查找对应文档后解决,记录下来用来以后遇到使用 解决: 1. 将 supervisord.conf 文件下对应的 /tmp 目录 ...
- vim基本配置
#set nocompatible # 打开语法高亮 syntax on # 在底部显示当前模式 set showmode # 命令模式下显示键入的指令 set showcmd # 支持使用鼠标 se ...
- hive表的DDL
查看表 hive> show tables;创建表 hive> create table t1(id int);查看表结构 ...