显示Unicode字符

显示Unicode字符,unicode,translation,glyph,Unicode,Translation,Glyph,我已经在这里寻找了这类问题的答案,并且已经找到了很多答案——但我仍然对这件事情表面上的琐碎性有着令人不安的怀疑 我读过这篇关于这个主题的非常有趣的有用的文章:,但它让我想知道,在给定Unicode数据缓冲区的情况下,如何识别单个glyph 我的问题是: 我如何解析Unicode字符串,比如UTF-8 假设我知道字节顺序,当我遇到一个应该由6个字节表示的标志符号的开头时会发生什么 也就是说,如果我正确解释了存储方法 这一切都与我正在设计的一个文本显示系统有关,该系统使用OpenGL。 我将字形数据

我已经在这里寻找了这类问题的答案,并且已经找到了很多答案——但我仍然对这件事情表面上的琐碎性有着令人不安的怀疑

我读过这篇关于这个主题的非常有趣的有用的文章:,但它让我想知道,在给定Unicode数据缓冲区的情况下,如何识别单个glyph

我的问题是:

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

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

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

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

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


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

好吧,我认为这就解决了这个问题:

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

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

我假设“解析”是指转换为代码点

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

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

  • 检查第一个字节以查看字符中有多少字节
  • 查看字符的尾随字节,确保它们在80-BF范围内。如果没有,请报告错误
  • 使用位屏蔽和移位将字节转换为代码点
  • 如果获得的字节序列长于表示字符所需的最小长度,请报告错误
  • 按序列长度递增指针,并重复下一个字符
  • 此外,在我看来,2 每个字符的字节数根本不是 足以代表一切可能 Unicode元素

    不是。Unicode最初是一种16位编码的固定格式。后来决定65536个字符不够,因此创建了UTF-16,并重新定义了Unicode,以使用0到1114111之间的代码点


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

    谢谢您的回复!根据我所读到的内容,似乎我应该使用UTF-8:我可以以字节顺序无关的方式迭代字符串,并按照它们出现的样子组装各个代码点,就像变长结构一样。这让我想知道为什么wchar_______________________________________________。这使得操纵更容易,而不是更难。您可以将
    wchar\u t*
    增量一次以获得下一个字符,当
    char*
    指向多字节字符串时,这一点要困难得多。有一个小的VC++/Windows错误,他们使用UTF1616字符串的<代码> WCARGYT ,但是一般不能责怪C++。例如,在Linux上,它只是UTF-32,一切正常。我所指的缺点是,我必须跟踪它的大小和字节顺序,并设计代码来处理大小和存储不可预测的“原子”数据类型(与“字节”和“字符”没有什么不同)。UTF-8对于迭代来说很烦人,但我的意图是将其用于存储。如果wchar_t是一个UTF-32,那么不管编译器是什么,它的使用都会变得简单一点(尽管字节顺序令人恼怒,而且它迫使“可移植”的序列化代码表现出不优雅)。