根据维基百科UTF-8页面,我从人们那里听到了相互矛盾的观点。
它们是一样的,不是吗?有人能澄清一下吗?
根据维基百科UTF-8页面,我从人们那里听到了相互矛盾的观点。
它们是一样的,不是吗?有人能澄清一下吗?
当前回答
UTF-8是一种使用8位序列编码Unicode字符的方法。
Unicode是一种用于表示来自多种语言的各种字符的标准。
其他回答
作为一个直截了当的简单回答:
Unicode是一种表示多种人类语言字符的标准。 UTF-8是一种编码Unicode字符的方法。
是的:我故意忽略了UTF-8的内部工作原理。
Unicode只定义码位,即代表一个字符的数字。如何在内存中存储这些代码点取决于所使用的编码。UTF-8是编码Unicode字符的一种方式。
不幸的是,“Unicode”根据上下文以各种不同的方式使用。它最正确的用法(IMO)是作为编码字符集——即一组字符以及字符与表示它们的整数码位之间的映射。
UTF-8是一种字符编码——一种将字节序列转换为字符序列的方法,反之亦然。它涵盖了整个Unicode字符集。ASCII编码为每个字符一个字节,其他字符根据其确切的码位占用更多字节(当前定义的所有码位最多4个字节,即最多U-0010FFFF,实际上4个字节可以处理最多U-001FFFFF)。
当“Unicode”被用作字符编码的名称时(例如,作为. net编码。Unicode属性)通常表示UTF-16,它将大多数常见字符编码为两个字节。一些平台(特别是。net和Java)使用UTF-16作为它们的“原生”字符编码。如果您需要担心不能在单个UTF-16值中编码的字符(它们被编码为“代理对”),这将导致一些棘手的问题——但大多数开发人员从不担心这一点,IME。
关于Unicode的一些参考:
Unicode联盟网站,特别是教程部分 乔尔的文章 我自己的文章(面向. net)
让我用一个例子来说明这个话题:
A Chinese character: 汉
its Unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
目前还没有什么神奇的,很简单。现在,假设我们决定将这个字符存储在硬盘驱动器上。为此,我们需要以二进制格式存储字符。我们可以简单地将其存储为'01101100 01001001'。完成了!
但是等一下,'01101100 01001001'是一个字符还是两个字符?你知道这是一个字符,因为我告诉过你,但当计算机读取它时,它不知道。所以我们需要某种编码来告诉计算机把它当做一个。
这就是UTF-8规则的用武之地:https://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格式存储这个字符,我们需要给我们的字符加上一些'headers'前缀。我们的中文字符有16位长(你自己计算二进制值),所以我们将在第三行使用该格式,因为它提供了足够的空间:
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二进制值的汉字!你自己看看:https://www.fileformat.info/info/unicode/char/6c49/index.htm
总结
A Chinese character: 汉
its Unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
encode 6C49 as UTF-8: 11100110 10110001 10001001
附注:如果你想用Python学习本主题,请点击这里。
Unicode是与ISO/IEC 10646一起定义通用字符集(UCS)的标准,UCS是表示几乎所有已知语言所需的所有现有字符的超集。
Unicode为其存储库中的每个字符分配一个名称和一个数字(字符代码或代码点)。
UTF-8编码,是一种在计算机内存中以数字方式表示这些字符的方法。UTF-8将每个码位映射到一个八字节序列(8位字节)
,例如,
UCS字符= Unicode字符
UCS代码点= U+24B62
UTF-8 encoding = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)