是否有用于UTF8字符的分隔符字节?

问题描述:

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

+0

要小心格式错误的输入,例如,如果序列超过4个字节,请确保您的代码不会像缓冲区溢出那样做不好的事情。 – 2010-02-23 23:37:45

+0

完成必要的拾取操作后,最终会产生一串长度为1到4个字节的字符;你打算怎么做?你为什么不解码并处理所产生的Unicode字符? – 2010-03-08 01:49:11

+0

@JohnMachin在我的案例中,“字符串”太大而无法一次处理,我的代码搜索安全的字节偏移量以将数据分割为可以单独处理的较小块。 – 2016-07-26 04:01:15

采取这里看看......

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

如果你正在寻找识别字符之间的边界,你需要的是在“说明”中的表。

获得高位为零的唯一方法是ASCII子集0..127,以单个字节编码。所有的非ASCII代码点都有第二个字节,最高两位为“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中的代码点不一定与某个字符相同。例如,有修饰符码点(如口音)。

+0

表情符号变异序列怎么样?例如,如果字符'U + 1F469'(在二进制文件'11110000 10011111 10010001 10101001'中)是它自己的,那么你会得到“女人”表情符号。但如果它后面跟着'U + 1F3FD'(二进制'11110000 10011111 10001111 10111101'),那么它将是一个棕色皮肤的女人。你怎么能安全地检测到这个边界以避免破坏两者之间的utf-8字节?两个代码点都是有效的(后者在OS X上呈现为棕色方块),但用户不会期望它们被分割。 – 2016-07-26 03:55:38

+0

@AbhiBeckert - 你在错误的层面上思考。 UTF-8没有定义或关心Unicode代码点的序列是如何相互关联的。首先,您将UTF-8(或其他编码)转换为Unicode码流,然后解释它。我不知道Unicode特定的细节,但处理修饰符代码点问题的一般方法与识别编程语言标记器中的关键字和其他标记相同。可能有更好的Unicode方式,但我不知道,无论如何,你应该问一个单独的问题。 – Steve314 2016-07-26 04:53:29

+0

我试图找出“字符之间的界限”,其中“字符”是一个单一的字形被绘制到屏幕上,这正是您正在回答的问题,据我所知。我将大量(可能是千兆字节)数量的utf-8数据分成单独绘制到屏幕上的较小块(数十个字节),如果字节按照您在您的建议中分开的方式分开回答。 – 2016-07-26 04:57:13

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

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

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

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

+0

“UTF-8字符”是一个用词不当。您似乎指的是代表非ASCII字符的两到四个字节的序列。谈到理解Unicode时,我认为让词汇正确是战斗的一半。 – 2010-02-24 15:26:05