3

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

首先,谁能确认我对 UTF-8/UTF-16 编码的可变长度特性的理解?其次,虽然会浪费大量空间,但 UTF-32(固定大小,每个字符用 4 个字节表示)是确保每个字符串可以以固定长度存储的最佳选择吗?谢谢!

4

1 回答 1

2

Unicode 术语:

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

所以:

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

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

在通过用户界面传达长度限制方面,您可能希望根据代码单元大小和典型客户做出某种妥协,而不是尝试找到您可以构建的最复杂字素的宽度。

于 2012-12-05T16:36:59.387 回答