适当编码Unicode字符串的固定长度存储?

时间:2012-12-05 15:58:28

标签: string unicode encoding character-encoding

我将要开发需要读取/写入Unicode字符串(特别是英语,德语,西班牙语和阿拉伯语)到软件设备的软件(在c#中)。固件开发人员告诉我,他的代码希望将每个字符串作为固定长度的字节数组存储在一个二进制文件中,这样他就可以使用索引快速访问任何字符串(索引*长度=起始偏移量,然后读取固定长度的字节数) )。我知道.NET内部使用UTF-16编码,我认为这在技术上是一种可变长度编码(取决于Unicode代码点的数量)。我很确定英语,德语和西班牙语在使用UTF-16编码时都会使用两个字节/字符,但我对阿拉伯语不太确定。看起来可能有一些阿拉伯字符在UTF-16中可能需要三个字节,这似乎打破了固件开发人员计划将字符串存储为固定长度。

首先,任何人都可以确认我对UTF-8 / UTF-16编码的可变长度性质的理解吗?第二,尽管它会浪费大量空间,但是UTF-32(固定大小,每个字符用4个字节表示)是确保每个字符串可以存储为固定长度的最佳选择吗?谢谢!

1 个答案:

答案 0 :(得分:2)

Unicode术语:

  • Unicode字符集中的每个条目都是代码点
  • 编码代码点由转换格式的一个或多个代码单元组成(UTF-8使用8位代码单元; UTF- 16使用16位代码单元)
  • 用户可见的字形可能包含sequence of code points

所以:

  • UTF-8中的代码点为1,2,3或4个八位字节
  • UTF-16中的代码点为2或4个八位字节
  • UTF-32中的代码点为4个八位字节
  • 屏幕上呈现的字素数可能少于代码点数

因此,如果你想支持整个Unicode范围,你需要使固定长度的字符串成为32位的倍数,而不管你选择哪种UTF作为编码(我假设未使用的字节将被设置为0x0并且这些将被附加,在I / O期间进行修整。)

在通过用户界面传达长度限制方面,您可能希望根据代码单元大小和典型客户决定一些妥协,而不是试图找到您可以构建的最复杂字素的宽度。 / p>