string - Unicode 字符串的固定长度存储的正确编码?

标签 string unicode encoding character-encoding

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

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

最佳答案

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 期间被修剪。)

就通过用户界面传达长度限制而言,您可能希望根据代码单元大小和典型客户做出一些折衷,而不是试图找到您可以构建的最复杂字素的宽度。

关于string - Unicode 字符串的固定长度存储的正确编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13727272/

相关文章:

php - 将 PHP 默认编码设置为 UTF-8

ruby-on-rails - mysql2 gem 0.3.15 提供编码设置为 "utf8"的 ASCII-8BIT

string - 学习 Haskell : String manipulation question

来自控制台 (@ARGV)/Windows/的 Perl unicode 支持

PHP:依赖于语言环境的 float 到字符串转换

ios - 如何使用字母搜索 unicode 字符?

c++ - QChar::isLetterOrNumber() 失败

json - JSON 编码器/解码器的不同结构属性 "published"

java - 在字符串中表示 java 中的引号字符有哪些不同的方法?

javascript - 未终止的字符串文字