好。我知道这看起来像典型的“为什么他不只是谷歌它或去 www.unicode。 org 并查找它?问题,但对于这样一个简单的问题,在检查了两个来源后,答案仍然没有找到。

我很确定这三种编码系统都支持所有Unicode字符,但我需要在演示文稿中声明之前确认。

奖金问题:这些编码在可以扩展支持的字符数方面是否有所不同?

有帮助吗?

解决方案

不,它们只是不同的编码方法。它们都支持对同一组字符进行编码。

UTF-8使用每个字符一到四个字节的任何位置,具体取决于您编码的字符。 ASCII范围内的字符只占用一个字节,非常不寻常的字符占用四个字符。

UTF-32每个字符使用四个字节,无论它是什么字符,因此它总是使用比UTF-8更多的空间来编码相同的字符串。唯一的优点是您可以通过仅计算字节数来计算UTF-32字符串中的字符数。

UTF-16对大多数字符使用两个字节,对于不常见字符使用四个字节。

http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings

其他提示

没有Unicode字符可以存储在一个编码中而不能存储在另一个编码中。这只是因为有效的Unicode字符被限制为可以存储在UTF-16中的内容(UTF-16具有三种编码中最小的容量)。换句话说,UTF-8和UTF-32 可以用于表示比UTF-16更广泛的字符,但它们不是。继续阅读以了解更多详情。

UTF-8

UTF-8是一个可变长度代码。有些字符需要1个字节,有些字符需要2个字节,有些需要3个字节和4个字节。每个字符的字节只是一个接一个地写成连续的字节流。

虽然一些UTF-8字符长度可以是4个字节,但UTF-8 不能编码2 ^ 32个字符。它甚至都不是很接近。我会尝试解释原因。

读取UTF-8流的软件只获取一个字节序列 - 如何判断接下来的4个字节是单个4字节字符,还是两个2字节字符,或4个1字节字符(或其他一些组合)?基本上这是通过确定某些1字节序列不是有效字符,并且某些2字节序列不是有效字符来完成的,依此类推。当出现这些无效序列时,假设它们构成更长序列的一部分。

你已经看到了一个相当不同的例子,我敢肯定:它被称为逃避。在许多编程语言中,决定字符串源代码中的 \ 字符不会转换为字符串的“编译”字符中的任何有效字符。形成。当在源中找到\时,它被假定为较长序列的一部分,如 \ n \ xFF 。请注意, \ x 是无效的2个字符序列, \ xF 是无效的3个字符序列,但 \ xFF 是有效的4个字符的序列。

基本上,在拥有多个角色和短角色之间需要进行权衡。如果你想要2 ^ 32个字符,它们需要平均4个字节长。如果您希望所有字符都是2个字节或更少,那么您不能超过2 ^ 16个字符。 UTF-8给出了合理的妥协:所有 ASCII 字符(ASCII 0到127)都给出了1-字节表示,这对兼容性很好,但允许更多字符。

与大多数可变长度编码一样,包括上面显示的转义序列类型,UTF-8是瞬时代码。这意味着,解码器只是逐字节读取,一旦到达字符的最后一个字节,就会知道字符是什么(并且它知道不是的开头更长的性格)。

例如,字符“A”使用字节65表示,并且没有两个/三个/四字节字符,其第一个字节是65.否则解码器将无法区分这些字符一个'A',后跟别的东西。

但UTF-8受到进一步限制。它确保在较长字符的编码中,较短字符的编码永远不会出现任何地方。例如,4字节字符中的所有字节都不能为65。

由于UTF-8有128个不同的1字节字符(字节值为0-127),因此所有2,3和4字节字符必须仅由128-256范围内的字节组成。这是一个很大的限制。但是,它允许面向字节的字符串函数在很少或不需要修改的情况下工作。例如,如果C的 strstr() 函数的输入是有效的UTF-8字符串,则该函数始终按预期工作。

UTF-16

UTF-16也是一个可变长度代码;它的字符消耗2或4个字节。 0xD800-0xDFFF范围内的2字节值保留为

UTF-8,UTF-16和UTF-32都支持全套unicode代码点。没有一个支持的字符而不支持另一个字符。

关于奖金问题“这些编码是否可以扩展为支持的字符数量不同?”是的,不是。 UTF-8和UTF-16的编码方式将它们可以支持的代码点总数限制为小于2 ^ 32。但是,Unicode Consortium不会向UTF-32添加无法用UTF-8或UTF-16表示的代码点。这样做会违反编码标准的精神,并且无法保证从UTF-32到UTF-8(或UTF-16)的一对一映射。

我个人总是查看有关unicode,编码和字符集的 Joel的帖子疑问。

所有UTF-8/16/32编码都可以映射所有Unicode字符。请参阅维基百科的Unicode编码比较

这篇IBM文章用UTF-8编码XML文档非常有帮助,并表明如果您有选择,最好选择UTF-8。主要原因是广泛的工具支持,UTF-8通常通过通过不知道unicode的系统。

规范说明部分“> IBM文章

  

W3C和IETF都有   最近变得更加坚定   选择UTF-8 first,last和   有时只。 W3C角色   万维网1.0的模型:   基础知识陈述,“当一个独特的   字符编码是必需的,   字符编码必须是UTF-8,   UTF-16或UTF-32。 US-ASCII是   向上兼容UTF-8(an   US-ASCII字符串也是UTF-8   string,参见[RFC 3629]),UTF-8是   因此如果兼容性合适   需要US-ASCII。“在   练习,兼容US-ASCII   是如此有用它几乎是一个   需求。 W3C明智地解释说,   “在其他情况下,例如   API,UTF-16或UTF-32可能更多   适当。可能的原因   选择其中之一包括   内部处理的效率和   与其他人的互操作性   。流程"

正如大家所说,UTF-8,UTF-16和UTF-32都可以编码所有Unicode代码点。但是,UCS-2(有时被错误地称为UCS-16)变体不能,这是你找到的那个,例如在Windows XP / Vista中

有关详情,请参阅维基百科

编辑:我错了Windows,NT是唯一一个支持UCS-2的人。但是,许多Windows应用程序将假定每个代码点只有一个单词,如UCS-2,因此您可能会发现错误。请参阅另一篇维基百科文章。 (感谢JasonTrue)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top