如何在不支持UTF-8的格式中存储Unicode数据

4

好的,这是又一个字符编码问题,展示了我的对Unicode一无所知。

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

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

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

我绝对需要更多的编码方式,而不仅仅是系统代码页。因为.shp文件使用.dbf文件存储属性数据,所以至少应支持.dbf格式指定的所有编码方式(请参阅xBase格式描述)。支持的编码方式包括:DOS USADOS MultilingualWindows ANSIStandard MacintoshEE MS-DOSNordic MS-DOSRussian MS-DOSIcelandic MS-DOSKamenicky (Czech) MS-DOSMazovia (Polish) MS-DOSGreek MS-DOS (437G)Turkish MS-DOSRussian MacintoshEastern European MacintoshGreek MacintoshWindows EERussian WindowsTurkish WindowsGreek Windows
此外,一些应用程序支持使用 *.cpg 文件来指定额外的代码页(尽管我了解对于 utf-8 和其他许多代码页的支持是有限的)。因为我正在尝试开发一个通用工具,所以不能假设任何关于 .xls 文件中 Unicode 内容的内容。

许多应用程序只能正确显示使用系统代码页编码的文件。如果您的目标应用程序是这种情况,那么您在估计“最佳”代码页方面就没有太多的灵活性,而是由目标操作环境确定。 - Todd Owen
更新问题以更具体。 - fmark
2个回答

1
在必须将Unicode字符串转换为特定编码页的字符串的情况下,最佳实践是什么?
这取决于文件格式。如果它支持Unicode“转义序列”,例如XML的€或JSON的\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帮助生成“最接近的近似值”。

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


1

你的文本是什么语言?如果大部分字符都是ASCII,最好将原始的UTF-8编码文本写成这样。一个不支持UTF-8的程序仍然可以正确读取ASCII文本,并显示未知字符的乱码ASCII。


我不知道它会用什么语言,提前准备。我已经更新了问题以反映这一点。 - fmark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接