UTF有什么区别?

我听到人们的意见冲突 - 根据维基百科的说法,请看这里。

他们是一样的东西,不是吗? 有人可以澄清吗?


扩展其他人给出的答案:

我们有很多语言,电脑应该显示很多字符。 Unicode为每个字符分配一个唯一的编号或代码点。

计算机处理像字节这样的数字......在这里忽略了一些历史记录,并忽略了内存寻址问题,8位计算机将8位字节视为硬件中容易表示的最大数字单位,16位计算机将扩展那到两个字节,等等。

像ASCII这样的旧字符编码来自(预)8位时代,并尝试将当时计算中的主要语言(即英语)填充到范围从0到127(7位)的数字中。 在字母表中有26个字母,包括大写字母和非大写字母,数字和标点符号,这些字母都很好用。 对于其他非英语语言,ASCII扩展了第8位,但根据所显示的语言,通过此扩展可获得的额外128个数字/代码点将映射到不同的字符。 ISO-8859标准是这种映射的最常见形式; ISO-8859-1和ISO-8859-15(也被称为ISO-Latin-1,latin1,是的,还有8859 ISO标准的两个不同版本)。

但是,当您想要表示来自多种语言的字符时,这还不够,因此将所有可用字符填充到单个字节中将不起作用。

基本上有两种不同类型的编码:通过添加更多位来扩展数值范围。 这些编码的例子是UCS2(2个字节= 16位)和UCS4(4个字节= 32位)。 它们本质上与ASCII和ISO-8859标准有相同的问题,因为它们的值范围仍然有限,即使极限高得多。

另一种类型的编码使用每个字符可变数量的字节,最常见的编码是UTF编码。 所有UTF编码的工作方式大致相同:您选择单位大小,对于UTF-8是8位,对于UTF-16是16位,对于UTF-32是32位。 标准然后将这些位中的一些定义为标志:如果它们被设置,则单元序列中的下一个单元被认为是同一个字符的一部分。 如果他们没有设置,这个单位完全代表一个角色。 因此,最常见的(英文)字符只占用UTF-8中的一个字节(UTF-16中的两个,UTF-32中的四个),但其他语言字符可占用六个字节或更多。

多字节编码(在上面的解释之后我应该说多单元)具有相对节省空间的优点,但是诸如查找子串,比较等的操作都必须将字符解码为unicode编码在这些操作可以被执行之前的点(虽然有一些快捷方式)。

UCS标准和UTF标准都按Unicode中定义的编码点编码。 理论上,这些编码可以用来编码任何数字(在编码支持的范围内) - 但是这些编码当然是用来编码Unicode编码点的。 这就是你们之间的关系。

Windows将所谓的“Unicode”字符串处理为UTF-16字符串,而现在大多数UNIX默认使用UTF-8。 像HTTP这样的通信协议通常在UTF-8上工作得最好,因为UTF-8的单元尺寸与ASCII相同,并且大多数这样的协议都是在ASCII时代设计的。 另一方面,UTF-16在表示所有生活语言时提供了最佳的平均空间/处理性能。

Unicode标准定义的代码点少于可以用32位表示的代码点。 因此,出于所有实际目的,UTF-32和UCS4成为相同的编码,因为您不太可能需要处理UTF-32中的多单元字符。

希望填补一些细节。


根据具体情况,“Unicode”不幸地以各种不同的方式使用。 它最正确的用法(IMO)是一种编码字符集 - 即一组字符以及字符和表示它们的整数代码点之间的映射。

UTF-8是一种字符编码 - 一种将字节序列转换为字符序列的方式,反之亦然。 它涵盖了整个Unicode字符集。 ASCII被编码为每个字符一个字节,其他字符取决于其确切的编码点需要更多的字节(对于所有当前定义的编码点,最多4字节,即高达U-0010FFFF,实际上4字节可以应付高达U型001FFFFF)。

当“Unicode”用作字符编码的名称时(例如,作为.NET Encoding.Unicode属性),它通常意味着UTF-16,它将最常见的字符编码为两个字节。 一些平台(特别是.NET和Java)使用UTF-16作为其“本地”字符编码。 如果您需要担心无法用单个UTF-16值编码的字符(它们被编码为“代理对”),这会导致毛病,但大多数开发人员从不担心IME。

关于Unicode的一些参考:

  • Unicode联盟网站,特别是教程部分
  • 乔尔的文章
  • 我自己的文章(面向.NET)

  • 让我用一个例子来说明这个话题:

    A chinese character:      汉
    it's unicode value:       U+6C49
    convert 6C49 to binary:   01101100 01001001
    

    目前没有什么神奇的,它非常简单。 现在,假设我们决定将这个角色存储在我们的硬盘上。 为此,我们需要以二进制格式存储字符。 我们可以简单地将它存储为'01101100 01001001'。 完成!

    但是等一下,是'01101100 01001001'一个字符还是两个字符? 你知道这是一个角色,因为我告诉过你,但是当一台计算机读取它时,它不知道。 所以我们需要某种“编码”来告诉计算机将它视为一个整体。

    这是'UTF-8'规则的出处:http://www.fileformat.info/info/unicode/utf8.htm

    Binary format of bytes in sequence
    
    1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
    0xxxxxxx                                                7             007F hex (127)
    110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
    1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
    11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)
    

    根据上面的表格,如果我们想使用'UTF-8'格式存储这个字符,我们需要在我们的字符前加上一些'标题'。 我们的汉字长16位(自己计算二进制值),所以我们将使用第3行的格式,因为它提供了足够的空间:

    Header  Place holder    Fill in our Binary   Result         
    1110    xxxx            0110                 11100110
    10      xxxxxx          110001               10110001
    10      xxxxxx          001001               10001001
    

    将结果写在一行中:

    11100110 10110001 10001001
    

    这是汉字的UTF-8(二进制)值! (自己确认一下:http://www.fileformat.info/info/unicode/char/6c49/index.htm)

    概要

    A chinese character:      汉
    it's unicode value:       U+6C49
    convert 6C49 to binary:   01101100 01001001
    embed 6C49 as UTF-8:      11100110 10110001 10001001
    
    链接地址: http://www.djcxy.com/p/66353.html

    上一篇: What is the difference between UTF

    下一篇: 8) reading and writing to files in Python