【问题标题】:Displaying Unicode Characters显示 Unicode 字符
【发布时间】:2010-06-16 17:49:26
【问题描述】:

我已经在这里搜索过这类问题的答案,并且找到了很多答案——但我仍然对这件事表面上的琐碎问题持怀疑态度。

我读过这篇非常有趣的文章:http://www.joelonsoftware.com/articles/Unicode.html,但它让我想知道如何在给定 Unicode 数据缓冲区的情况下识别单个字形。

我的问题是:

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

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

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

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

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

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

【问题讨论】:

    标签: unicode translation glyph


    【解决方案1】:

    我将如何解析 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 位。

    【讨论】:

    • 感谢您的回复!根据我所阅读的内容,我似乎应该使用 UTF-8:我可以以与字节顺序无关的方式遍历字符串,并在它们出现时组装各个代码点,如可变长度结构。这让我想知道为什么 wchar_t 以及围绕它的操纵的肮脏首先是一个如此绝妙的主意。
    • wchar_t 旨在足够大以存储任何字符。这使得操作更容易,而不是更难。您可以增加一次wchar_t* 以获得下一个字符,当您有一个指向多字节字符串的char* 时,这要困难得多。有一个小的 VC++/Windows 错误,他们将 wchar_t 用于 UTF-16 字符串,但你不能为此责怪 C++。例如,在 Linux 上,它只是 UTF-32,一切都按预期工作。
    • 我所指的令人讨厌的事实是,我必须跟踪它的大小和字节顺序,以及可以处理有点不可预测的“原子”数据类型的设计代码大小和存储(与“字节”与“字符”不同)。 UTF-8 迭代起来很烦人,但我的意图是用它来存储。如果 wchar_t 是 UTF-32,无论编译器是什么,生活都会轻松一些(尽管字节顺序令人恼火,并且它迫使“可移植”序列化代码表现出不优雅)。
    【解决方案2】:

    嗯,我想这回答了它:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-26
      • 2013-09-22
      • 2012-06-07
      • 2011-07-18
      • 2011-12-06
      • 1970-01-01
      • 2012-08-08
      • 2015-07-04
      相关资源
      最近更新 更多