中文

操作方法:读写在不同代码页编码的 shapefile 和 dBASE 文件

摘要

Esri 在 ArcGIS Desktop 应用程序(ArcMap、ArcCatalog 和 ArcGIS Pro)中执行了一个“代码页转换”功能,该功能允许桌面应用程序读写在不同代码页编码的 shapefile 和 dBASE 文件。 可在系统注册表内指定代码页值,以激活 dBASE 文件的代码页转换功能(名为“dbfDefault”)。 DBF 文件的标题中包含对代码页的引用。 Shapefile (.DBF) 中的默认代码页设置为 UTF-8 (UNICODE)。 这是当前国际化实践的默认设置。

 

常见问题解答

dbfDefault 设置有何用处?

在系统注册表内设置一个代码页值后,用户即可读写在该页中编码的 shapefile 和 dBASE 文件。 例如,用户可以在 OEM 中设置代码页注册表值,以导出在 OEM 中编码的 shapefile。 此外,用户还可读取文件中未存储代码页信息的 shapefile 和 dBASE 文件,前提是用户知道文件在哪个代码页中编码。

为什么要设置 dbfDefault?
在 ArcMap、ArcCatalog 和 ArcGIS Pro 中打开 shapefile 和 dBASE 文件时,这些应用程序会查看 dBASE 文件标题上的“语言驱动程序 ID”(LDID) 或者相关的 *.CPG 文件,以确定代码页并决定读取文件的哪个代码页。 如有必要,ArcGIS Desktop 会基于检索到的代码页信息,通过代码页转换功能显示相应的字符串。 如果 dBASE 文件缺少 LDID 或者 .CPG 文件,则假设文件在 Windows (ANSI/Multi-byte) 代码页中编码。

如果 Desktop 程序读取在 OEM 中编码的 dBASE 文件,但文件中不包含任何代码页信息或不包含 LDID 或 CPG 文件,则字符无法正确显示。 这是因为 Desktop 程序无法找到代码页信息,所以假定文件是在 ANSI 代码页中编码的,而文件实际上是在 OEM 中编码的。 这表示 ArcGIS 将 OEM 文件视为在 ANSI 中编码,所以导致储存在文件中的 8 位字符显示不正确。

大多数 shapefile 和 dBASE 文件应将代码页信息存储在文件中。 诸如 Microsoft Access 和 Excel 等程序将 dBASE 文件编码于 OEM 中,但不包含 LDID 中的代码页信息,所以 ArcGIS 无法正确读取文件。 要避免此类问题,用户在打开缺少代码页信息的文件之前,可以为适当的代码页设置 dbfDefault。

dbfDefault 的工作原理是什么?

系统注册表中的“dbfDefault”设置定义了一个 shapefile 和 dBASE 文件导出的代码页。 在 ArcGIS Desktop 中创建的 shapefile 和 dBASE 文件的代码页被编码到由系统注册表的“dbfDefault”值定义的代码页中。 例如,如果将“dbfDefault”设置为OEM,那么在 ArcMap、ArcCatalog 和 ArcGIS Pro 中创建的 shapefile 和 dBASE 文件就会在 OEM 中进行编码。 另外,如果将“dbfDefault”设置为 ANSI,那么 shapefile 和 dBASE 文件将在 ANSI 中编码。

如果 shapefile 或 dBASE 文件缺少 LDID 或 .cpg 文件,ArcGIS 则假定要编码的文件位于 dbfDefault 定义的代码页中。 例如,如果 dbfDefault 值被设置为 OEM,而 dBASE 文件缺少 LDID 和 .cpg 文件,ArcGIS 则假定文件是在 OEM 中编码的,因此将执行代码页转换以显示 ArcMap、ArcCatalog 和 ArcGIS Pro 中的 8 位字符(因为这些应用程序都是使用 ANSI 代码页来显示字符串的 Windows 程序)。

注: 如果用户将 dbfDefault 值设置为某个代码页,那么在 ArcGIS 中导出的所有 shapefile 和 dBASE 文件都将编码在该代码页中。 所有不具备代码页信息的 shapefile 和 dBASE 文件也都假定位于该代码页中。 因此,当任务完成时,将 dbfDefault 值设置回默认值(无值)十分重要。

dbfDefault 适用于哪些程序?
ArcGIS Desktop 应用程序是唯一受到 dbfDefault 设置影响的程序。

受 dbfDefault 影响的数据格式有哪些?
Shapefile 和 dBASE 文件是唯一可供 dbfDefault 设置用于指定代码页的数据格式。

过程

给出的说明描述了如何在系统注册表中设置 dbfDefault 值。 下面列出两个选项。

警告: 下面的说明涉及更改操作系统的重要组成部分。 建议您先备份操作系统及文件(包括注册表),然后再继续操作。 必要时,请咨询合格的计算机系统专业人士。 您按照下列步骤进行操作期间,Esri 无法防止错误更改造成的结果;因此,请谨慎操作并自行承担风险。

选项 A

  1. 在系统注册表中添加两个名为 CommonCodePage 的项。
    如需添加项:
    1. 打开注册表编辑器:单击开始 > 运行,输入 regedit,然后单击确定
    2. 在注册表树中(位于注册表窗口左侧窗格中),转至
      • Computer\HKEY_CURRENT_USER\Software\ESRI,然后单击注册表项 Desktop 10.x (其中 x 为当前已安装的版本)。
      • 对于 ArcGIS Pro,单击注册表项 ArcGISPro
    3. 单击编辑菜单,然后单击新建 > 项
    4. 添加一个新项 Common:输入名称 Common 并按 Enter 键。
    5. 单击新的 Common 项,然后添加另一个新项 CodePage
  2. 将一个新的字符串值 dbfDefault 添加到 CodePage 项。
    添加字符串值:
    1. 单击新项 CodePage
    2. 编辑菜单中,单击新建 >字符串值
    3. 键入 dbfDefault 作为新值,并按 Enter 键。
  3. 输入一个代码页值。
    1. 选择刚刚添加的条目;必须选择 dbfDefault,而非 (Default)。
    2. 编辑菜单中,单击修改
    3. 值数据中,键入新的代码页值,在本示例中为 SJIS,然后单击确定
edit-string.png

ArcMap 的新 CodePage 项如下所示:

reg-update-arcmap.png

下表所示为支持的代码页标识符(不区分大小写)。

  • 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

注: 现在可采用 UTF-8 格式储存 Shapefile。 然而,仅 ArcMap、ArcCatalog 和 ArcGIS Pro 可识别以 UTF-8 编码的 shapefile。

选项 B
或者,用批处理文件修改 Windows 注册表。

  1. 在记事本中,使用以下编码创建文件 ChangeCodePage.bat
对于 ArcMap
@ECHO OFF IF "%1"=="" GOTO :EOF reg add HKEY_CURRENT_USER\Software\ESRI\Desktop10.8\Common\CodePage /v dbfDefault /t REG_SZ /d %1 /f
注: 对于 ArcMap,请根据需要更改该路径以匹配要修改的系统上的 ArcMap 版本,例如,..\Desktop10.7。

对于 ArcGIS Pro

@ECHO OFF IF "%1"=="" GOTO :EOF  reg add HKEY_CURRENT_USER\Software\ESRI\ArcGISPro\Common\CodePage /v dbfDefault /t REG_SZ /d %1 /f
  1. 将文件保存到要修改的计算机上的某个位置。
  2. 打开命令提示符窗口(可能需要以管理员身份运行以执行批处理文件)。
  3. 要执行批处理文件(在本例中,将代码页更改为日语),请导航到批处理文件所在位置并运行以下命令:
ChangeCodePage SJIS

cmd-bat-small.png

现在,已针对 ArcGIS Pro 创建注册表项,且代码页设置为 SJIS。

包含 ArcGIS Pro 新代码页设置的已更新注册表
 

上次修改时间: 3/13/2021

文章 ID: 000013192

软件: ArcMap 10.8.1, 10.8, 10.7.1, 10.7, 10.6, 10.5.1, 10.5, 10.4.1, 10.4, 10.3.1, 10.3, 10.2.2 ArcGIS Pro 2.4.3, 2.4.2, 2.4.1, 2.4, 2.3.3, 2.3.2, 2.3.1, 2.3, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2, 2.1.3, 2.1.2, 2.1.1, 2.1, 2.0.1, 2.0, 1.4.1, 1.4, 1.3.1, 1.3, 1.2