我们正在将数据库升级到11g,并将所有内容转换为Unicode。在线阅读后,我发现字符串中的每个字符都可以占用1,2或4个字节。
我想知道系统如何知道字符占用的字节数。 Unicode编码中的每个字节都有一个保留位,表示"这个字符是2字节"?
答案 0 :(得分:3)
首先,请注意Unicode与特定编码之间存在重大差异。有多种方法可以编码Unicode(UTF-8,UTF-16和UTF-32是三种更常见的),每种方法都有不同的属性。您似乎在描述UTF-8编码的属性。
是的,UTF-8编码字符串的每个字节中的前导位表示特定字符使用的字节数。 UTF-8 encoding上的维基百科文章显示了1,2,3和4字节字符的每个字节的各种位模式。
答案 1 :(得分:1)
这样的Unicode字符是一个抽象概念。当字符编码为字节字符串时,它们可能具有不同的长度。在UTF-32中,每个字符是4个字节。在UTF-16中,每个字符为2或4个字节。在UTF-8中,每个字符为1,2,3或4个字节。
在UTF-16中,前两个字节确定是否还有两个字节。如果前两个字节定义的数量位于称为“高代理”的特定指定范围内,则会出现附加字节。
在UTF-8中,第一个字节的位模式指定字符的字节数。如果最高有效位为0,则只有这一个字节(因此Ascii字符在Ascii中表示)。如果前三位是110,则还有一个字节。如果前四位是1110,又是两个字节,如果是1111,则还有三个字节。
如果从UTF-8流中选取任意字节,通常无法确定它是否为2,3或4字节表示的一部分。如果它是为起始字节描述的模式之一,您就知道它是什么。但如果它从第10位开始,你就无法知道。
这意味着必须按顺序处理UTF-8流。按字符位置直接寻址是不可能的;要找到 N 字符,您需要从头开始读取并观察起始字节的位模式。