固定长度存储Unicode字符串的正确编码方式是什么?

3
我将要处理使用C#编写的软件,该软件需要读写Unicode字符串(特别是英语,德语,西班牙语和阿拉伯语)到硬件设备。固件开发人员告诉我,他的代码期望将每个字符串存储为一个二进制文件中的定长字节数组,以便可以使用索引快速访问任何字符串(索引*长度=起始偏移量,然后读取定长字节数)。我理解.NET在内部使用UTF-16编码,这种编码技术上来说是一种变长编码(取决于Unicode码点的数量)。我相当确定使用UTF-16编码时,英语,德语和西班牙语都会使用两个字节/字符,但是对于阿拉伯语我就不太确定了。看起来有一些阿拉伯字符可能需要使用UTF-16中的三个字节,这似乎会破坏固件开发者将字符串存储为定长的计划。
首先,有人能够确认我对UTF-8 / UTF-16编码变长性质的理解吗?其次,尽管这将浪费大量空间,但是UTF-32(固定大小,每个字符使用4个字节表示)是否是确保每个字符串都可以存储为定长的最佳选择?谢谢!

我不确定我看到了什么问题。只要您的编码字符串不超过固定字段长度,使用可变长度编码会引入什么问题呢?您必须同意一种方式来标记字符串结尾和任何剩余未使用的字节之间的边界,但这个问题也适用于使用固定长度编码。 - anton.burger
此外,UTF-16 也可能是可以的。根据维基百科,大部分阿拉伯语都适用于基本多语言平面,这意味着您大部分时间可以使用一个16位代码单元来表示一个代码点。如果失败了,您可以使用2个代码单元(总共4个字节,但在UTF-16中从不使用3个字节)。最好确切地知道您需要表示哪些范围。http://en.wikipedia.org/wiki/Arabic_script_in_Unicode - anton.burger
Unicode 中不存在固定长度这一概念。请参见 utf8everywhere.org 中的“长度”。 - Pavel Radzivilovsky
1个回答

2
Unicode术语:
  • Unicode字符集中的每个条目都是一个代码点
  • 编码的代码点由一个或多个代码单元组成,采用转换格式(UTF-8使用8位代码单元;UTF-16使用16位代码单元)
  • 用户可见的字形可能由一系列代码点组成
所以:
  • UTF-8中的代码点为1、2、3或4个八位字节宽度
  • UTF-16中的代码点为2或4个八位字节宽度
  • UTF-32中的代码点为4个八位字节宽度
  • 屏幕上呈现的字形数量可能少于代码点数量
因此,如果要支持整个Unicode范围,无论您选择哪种编码方式(我假设未使用的字节将设置为0x0,并且这些字节将在I/O过程中被添加或修剪),您需要使固定长度的字符串成为32位的倍数。
关于通过用户界面传达长度限制,您可能需要根据代码单元大小和典型客户而做出一些妥协,而不是试图找到您可以构建的最复杂字形的宽度。

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