如何以不支持utf-8的格式存储unicode数据

时间:2010-07-03 03:16:51

标签: language-agnostic unicode character-encoding dbf

好的,这是另一个字符编码问题,证明了我对Unicode所有事情的无知。

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

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

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

我绝对可以使用只是系统代码页。由于.shp文件使用.dbf文件来存储其属性数据,因此至少应支持.dbf格式指定的所有代码页(请参阅xBase format description)。受支持的代码页为:DOS USADOS Multilingual, Windows ANSI, Standard 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 EE,{ {1}},Russian WindowsTurkish Windows

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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代码页。
  3.   

    然后转换所有不支持的   他们最接近的人物   代码页中的近似值(或   可怕的?)。这是通常的   接近?

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

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