【问题标题】:Are there delimiter bytes for UTF8 characters?UTF8 字符是否有分隔符字节?
【发布时间】:2011-01-20 07:30:58
【问题描述】:

如果我有一个包含 UTF8 内容的字节数组,我将如何解析它?是否有分隔符字节可以拆分来获取每个字符?

【问题讨论】:

  • 注意格式错误的输入,例如,如果序列超过 4 个字节,请确保您的代码不会出现缓冲区溢出等坏事。
  • 一旦你完成了必要的位选择,你最终会得到一堆字符,每个字符的长度从 1 到 4 个字节不等;你打算怎么办?为什么不直接解码并处理生成的 Unicode 字符?
  • @JohnMachin 在我的情况下,“一堆字符”太大而无法一次性处理,我的代码搜索一个安全的字节偏移量来将数据分割成可以工作的更小的块单独使用。

标签: c++ unicode utf-8


【解决方案1】:

看这里...

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

如果您想确定字符之间的边界,您需要的是“描述”中的表格。

获得高位零的唯一方法是 ASCII 子集 0..127,编码为单个字节。所有非 ASCII 代码点都从第 2 个字节开始,最高两位为“10”。代码点的前导字节永远不会有 - 它的高位表示字节数,但有一些冗余 - 你可以同样注意下一个没有“10”的字节来表示下一个代码点。

0xxxxxxx : ASCII
10xxxxxx : 2nd, 3rd or 4th byte of code
11xxxxxx : 1st byte of code, further high bits indicating number of bytes

Unicode 中的代码点不一定与字符相同。例如,有修饰符代码点(例如重音符号)。

【讨论】:

  • 表情符号变化序列怎么样?例如,如果字符U+1F469(二进制11110000 10011111 10010001 10101001)是独立的,你会得到“女人”表情符号。但是,如果后面跟着U+1F3FD(二进制11110000 10011111 10001111 10111101),那么它将是一个棕色皮肤的女人。您如何安全地检测此边界以避免在两者之间破坏 utf-8 字节?两个代码点本身都是有效的(后者在 OS X 上呈现为棕色方块),但用户不会期望它们被拆分。
  • @AbhiBeckert - 你想错了。 UTF-8 不定义也不关心 Unicode 代码点序列如何相互关联。首先,您将 UTF-8(或其他编码)转换为 Unicode 代码点流,然后进行解释。我不知道 Unicode 特定的细节,但处理修饰符代码点问题的一般方法与在编程语言标记器中识别关键字和其他标记相同。可能有更好的 Unicode 特定方式,但我不知道,无论如何,你应该问一个单独的问题。
  • 我正在尝试识别“字符之间的边界”,其中“字符”是一个被绘制到屏幕上的单个字形,这正是您尽可能回答的问题看。我将大量(可能是千兆字节)的 utf-8 数据拆分为较小的部分(长度为几十个字节),这些数据分别绘制到屏幕上,如果按照您在回答。
  • @Abhi - 你说得对,这个答案不能解决你的问题 - 它回答了 OP 提出的问题。我的答案是关于哪些字节构成特定的 Unicode 代码点。正如我所说,哪些 Unicode 代码点形成一个特定的字形是 UTF-8 没有定义的不同的东西。 Unicode 与 UTF-8、UTF-16 等编码不同。除了我已经说过的之外,我仍然不知道您的问题的答案。在一个 6 岁的答案上写 cmets 意味着可以回答你问题的人永远不会看到它。顺便说一句,我不是,也从来不是,Unicode 专家。
【解决方案2】:

第一位设置为 0 的字节是普通的 ASCII 字符。第一位设置为 1 的字节是 UTF-8 字符的一部分。

每个 UTF-8 字符中的第一个字节的第二位设置为 1,因此该字节具有最高有效位 11。属于同一 UTF-8 字符的每个后续字节都以 10 开头。

每个 UTF-8 字符的第一个字节还指示有多少以下字节属于该字符,具体取决于该字节的最高有效位中设置为 1 的位数。

有关更多详细信息,请参阅 UTF-8 的 Wikipedia page

【讨论】:

  • “UTF-8 字符”用词不当。您似乎指的是代表非 ASCII 字符的两到四个字节的序列。在理解 Unicode 方面,我相信掌握正确的词汇是成功的一半。
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 2023-04-04
  • 2018-07-31
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多