中文

操作方法:读写在不同代码页编码的 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 的工作原理是什么?
系统注册表中的“dbfDefault”设置定义了一个 shapefile 和 dBASE 文件导出的代码页。 在 ArcGIS Desktop 中创建的 shapefile 和 dBASE 文件的代码页被编码到由系统注册表的“dbfDefault”值定义的代码页中。 例如,如果将“dbfDefault”设置为OEM,那么在 ArcMap、ArcCatalog 和 ArcToolbox 中创建的 shapefile 和 dBASE 文件就会在 OEM 中进行编码。 另外,如果将“dbfDefault”设置为 ANSI,那么 shapefile 和 dBASE 文件将在 ANSI 中编码。

需要注意的是,有一种情况是例外:从 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
  1. 在系统注册表中添加两个名为“Common”和“CodePage”的项。
    如需添加项:
    1. 打开注册表编辑器:单击“开始”>“运行”,输入“regedit”,然后单击“确定”。
    2. 在注册表树中(位于注册表窗口左侧窗格中),转至“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”。)
    3. 添加一个名为 Commom 的新项(在“编辑”菜单中:
      导航到“新建”,选择“项”,输入名称“Common”,并按 Enter 键)。
    4. 单击刚刚创建的注册表项(公共),并添加一个名为“CodePage”的新项。
  2. 将一个新的字符串值“dbfDefault”添加到 CodePage 项中。
    添加字符串值:
    1. 单击“CodePage”项。
    2. 在“编辑”菜单中,导航到“新建”,然后选择“字符串值”。
    3. 键入'dbfDefault’作为新的值,并按“ENTER”键。

      新的“CodePage”项应如下显示:
      [O-Image] Screenshot of dbfDefault in
       
  3. 输入一个代码页值。
    1. 选择刚刚添加的条目;重要的是选择 dbfDefault,而不是 (Default)。
    2. 在“编辑”菜单中,单击”修改”。
    3. 在“值”数据中,键入新的代码页值,并单击“确定”。
      下表所示为支持的代码页标识符(不区分大小写)。
  • 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 注册表。
  1. 在记事本中,使用以下编码创建文件 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)。
  2. 将文件保存到要修改的计算机上的某个位置。
  3. 打开命令提示符窗口(可能需要“以管理员身份运行”以执行批处理文件)。
  4. 要执行批处理文件(在本例中,将代码页更改为日语),请导航到批处理文件所在位置并运行以下命令:
    ChangeCodePage SJIS
    此时注册表项已完成创建,且代码页已设置为 SJIS。
[O-Image]

上次修改时间: 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