0

我已经在这里搜索过这类问题的答案,并且找到了很多答案——但我仍然对这件事表面上的微不足道有这种挥之不去的怀疑。

我已经阅读了一篇关于该主题的非常有趣的有用文章:http: //www.joelonsoftware.com/articles/Unicode.html,但它让我想知道如何在给定 Unicode 数据缓冲区的情况下识别单个字形。

我的问题是:

我将如何解析 Unicode 字符串,比如 UTF-8?

假设我知道字节顺序,当我遇到应该由 6 个字节表示的字形的开头时会发生什么?

也就是说,如果我正确解释了存储方法。

这一切都与我设计用于 OpenGL 的文本显示系统有关。我将字形数据存储在显示列表中,我需要将字符串的内容转换为一系列字形索引,然后将其映射到显示列表索引(因为显然,将整个字形集存储在图形内存中并不总是可行的)。

考虑到我需要显示的所有内容,必须将每个字符串表示为一个短裤数组将需要大量存储空间。

此外,在我看来,每个字符 2 个字节根本不足以代表所有可能的 Unicode 元素。

4

2 回答 2

2

我将如何解析 Unicode 字符串,比如 UTF-8?

我假设通过“解析”,您的意思是转换为代码点。

通常,您不必这样做。例如,您可以在另一个 UTF-8 字符串中搜索一个 UTF-8 字符串,而无需关心这些字节代表什么字符。

如果您确实需要转换为代码点 (UTF-32),则:

  1. 检查第一个字节以查看字符中有多少字节。
  2. 查看字符的尾随字节以确保它们在 80-BF 范围内。如果不是,则报告错误。
  3. 使用位掩码和移位将字节转换为代码点。
  4. 如果您获得的字节序列长于表示字符所需的最小值,则报告错误。
  5. 将指针增加序列长度并重复下一个字符。

此外,在我看来,每个字符 2 个字节根本不足以代表所有可能的 Unicode 元素。

它不是。Unicode 最初旨在成为一种固定的 16 位编码。后来决定 65,536 个字符还不够,因此创建了 UTF-16,并重新定义了 Unicode 以使用 0 到 1,114,111 之间的代码点。

如果你想要一个固定宽度的编码,你需要 21 位。但是它们并不是很多具有 21 位整数类型的语言,因此实际上您需要 32 位。

于 2010-06-17T07:01:44.283 回答
0

好吧,我认为这回答了它:

http://en.wikipedia.org/wiki/UTF-8

为什么我第一次去搜索它没有出现,我不知道。

于 2010-06-16T18:13:24.457 回答