显示Unicode字符

时间:2010-06-16 17:49:26

标签: unicode translation glyph

我已经在这里搜索了这类问题的答案,并且已经找到了很多这些问题 - 但我仍然对这件事的明显琐碎性存在这种唠叨的怀疑。

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

我的问题是:

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

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

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

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

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

此外,在我看来,每个字符2个字节仅仅不足以表示每个可能的Unicode元素。

2 个答案:

答案 0 :(得分:2)

  

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

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

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

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

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

    此外,在我看来,2   每个字符的字节数不是   足以代表每一个可能的   Unicode元素。

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

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

答案 1 :(得分:0)

嗯,我认为这回答了它:

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

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