4

好的,这是另一个字符编码问题,表明我对 Unicode 的一切一无所知。

我正在从 Microsoft Excel.xls文件中读取数据,并将其存储在 ESRI shapefiles.shp中。对于 Excel > 5.0 的版本,excel 文件中的文本存储为 Unicode。但是,Unicode(特别UTF-8是对 shapefile 的支持是不一致的,因此我认为我根本不应该使用它。但是,Shapefile 确实支持老式代码页。

在必须将 Unicode 字符串转换为未知但特定代码页中的字符串的情况下,最佳实践是什么?

据我了解,Unicode 字符串可以包含来自多个“代码页”的字符。因此,我假设我必须以某种方式估计要使用的“最佳”代码页,然后将所有不受支持的字符转换为该代码页中最接近的近似值(或 dreaded ?)。这是通常的做法吗?

我绝对可以使用的不仅仅是系统代码页。因为.shp文件使用.dbf文件来存储它们的属性数据,所以至少.dbf应该支持格式指定的所有代码页(参见xBase 格式说明)。支持的代码页有: DOS USA, DOS Multilingual, Windows ANSI, Standard Macintosh, EE MS-DOS, Nordic MS-DOS, Russian MS-DOS, Icelandic MS-DOS, Kamenicky (Czech) MS-DOS, Mazovia (Polish) MS-DOS, Greek MS-DOS (437G), Turkish MS-DOS, Russian Macintosh, Eastern European Macintosh, Greek Macintosh, Windows EE, Russian Windows, Turkish Windows, Greek Windows

此外,一些应用程序支持使用*.cpg指定要使用的其他代码页的文件(尽管我理解对 的支持utf-8,并且我怀疑许多其他代码页是有限的)。

因为我正在尝试开发一个通用工具,所以我不能假设.xls文件中 Unicode 的内容。

4

2 回答 2

1

你的文字是什么语言的?如果字符主要是 ASCII,最好这样写原始的 UTF-8 编码文本。不支持 UTF-8 的程序仍将正确读取 ASCII 文本,并为未知字符显示乱码 ASCII。

于 2010-07-03T03:37:56.850 回答
1

在必须将 Unicode 字符串转换为未知但特定代码页中的字符串的情况下,最佳实践是什么?

取决于文件格式。€如果它支持像 XML's或 JSON's这样的 Unicode“转义序列” \u20AC,那么使用它们,你就不会丢失任何信息。如果不是,则需要采用不同的方法。

因此,我假设我必须以某种方式估计要使用的“最佳”代码页,

通常,在非 Unicode 系统上,您会将字符转换为默认编码,而不是任意代码页。

编辑:所以你确实可以选择代码页:

01h     DOS USA                      code page 437
6Ah     Greek MS-DOS (437G)          code page 737
02h     DOS Multilingual             code page 850
64h     EE MS-DOS                    code page 852
6Bh     Turkish MS-DOS               code page 857
67h     Icelandic MS-DOS             code page 861
65h     Nordic MS-DOS                code page 865
66h     Russian MS-DOS               code page 866
C8h     Windows EE                   code page 1250
C9h     Russian Windows              code page 1251
03h     Windows ANSI                 code page 1252
CBh     Greek Windows                code page 1253
CAh     Turkish Windows              code page 1254
04h     Standard Macintosh           code page 10000
98h     Greek Macintosh              code page 10006
96h     Russian Macintosh            code page 10007
68h     Kamenicky (Czech) MS-DOS
69h     Mazovia (Polish) MS-DOS
97h     Eastern European Macintosh

要选择代码页,我建议:

  1. 检查您的数据是否为纯 ASCII。如果是这样,您选择哪个代码页都没有关系。
  2. 如果没有,请尝试找到可以准确表示您的数据的代码页(或者如果您不能,请尽量减少无法表示的字符)。先尝试代码页 1252,然后再尝试其他 125x 代码页。除非您有画框字符,否则不要打扰 DOS 代码页。

然后将所有不受支持的字符转换为该代码页中最接近的近似值(或可怕的?)。这是通常的做法吗?

当我们需要将 UTF-8 文件转换为 windows-1252 或 EBCDIC 时,这是我们在工作中采用的方法。我使用 Unidecode 来帮助生成“最接近的近似值”。

但是,我们只替换字母和数字,而不是标点符号。用“”替换“”会破坏一些文件格式。

于 2010-07-03T22:17:54.417 回答