UTF-8和Unicode有什么区别?

根据Wikipedia UTF-8页面,我听到人们的意见不一致。 python

他们是同一回事,不是吗? 有人能够澄清吗? 安全


#1楼

Unicode是与ISO / IEC 10646一块儿定义通用字符集(UCS)的标准, 通用字符集是表示几乎全部已知语言所需的全部现有字符的超集。 学习

Unicode为每一个字符集分配一个名称和一个数字( 字符码代码点 )。 编码

UTF-8编码是一种在计算机内存中数字表示这些字符的方法。 UTF-8将每一个代码点映射为一系列八位字节(8位字节) spa

例如 设计

UCS字符= Unicode汉字字符 code

UCS代码点= U + 24B62 orm

UTF-8编码= F0 A4 AD A2(十六进制)= 11110000 10100100 10101101 10100010(bin) htm


#2楼

现有的答案已经解释了不少细节,但这是一个简短的答案,其中包含最直接的说明和示例。 排序

Unicode是将字符映射到代码点的标准
每一个字符都有一个惟一的代码点(标识号),这是一个数字,例如9731。

UTF-8是码点的编码
为了将全部字符存储在磁盘上(在文件中),UTF-8将字符分红最多4个八位字节(8位序列)-字节。 UTF-8是几种编码(表示数据的方法)之一。 例如,在Unicode中,(十进制)代码点9731表示一个雪人( ),它由UTF-8中的3个字节组成: E2 98 83

这是带有一些随机示例排序列表


#3楼

1. Unicode

世界各地有不少字符,例如“ $,&,h,a,t,?,张,1,=,+ ...”。

而后是一个致力于这些角色的组织,

他们制定了一个称为“ Unicode”的标准。

标准以下:

  • 建立一个窗体,其中每一个位置称为“代码点”或“代码位置”。
  • 整个位置从U + 0000到U + 10FFFF;
  • 到目前为止,某些职位已填充字符,其余职位已保存或为空。
  • 例如,位置“ U + 0024”用字符“ $”填充。

PS:固然,还有另外一个名为ISO的组织正在维护另外一个标准-“ ISO 10646”,几乎相同。

2. UTF-8

如上所述,U + 0024只是一个位置,所以咱们没法在计算机中为字符“ $”保存“ U + 0024”。

必须有一种编码方法。

而后是编码方法,例如UTF-8,UTF-16,UTF-32,UCS-2 ....

在UTF-8下,代码点“ U + 0024”被编码为00100100。

00100100是咱们在计算机中为“ $”保存的值。


#4楼

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

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

PS:若是您想在python中学习此主题, 请单击此处


#5楼

Unicode是一种普遍的标准,它定义了130,000个字符并为每一个字符分配一个数字代码(“代码点”)。 它还定义了有关如何对该文本进行排序,对其进行规范化,更改其大小写等的规则。 Unicode中的字符由从零到0x10FFFF(含零)的代码点表示,尽管有些代码点是保留的,不能用于字符。

Unicode中的代码能够用一种以上的编码表示。 最简单的是UTF-32,它简单地将代码点编码为32位整数,每一个整数为4个字节宽。

UTF-8是另外一种编码,并迅速成为事实上的标准。 它编码为字节值序列。 每一个代码点可使用可变数量的这些字节。 ASCII范围内的代码点被裸编码,以与ASCII兼容。 超出此范围的代码点使用可变数量的字节(二、3或4),具体取决于它们位于的范围。

UTF-8在设计时考虑了如下属性:

  • ASCII字符的编码方式与ASCII彻底相同,所以ASCII字符串也是有效的UTF-8字符串。

  • 二进制排序:使用朴素的二进制排序对UTF-8字符串进行排序仍将致使全部代码点均按数字顺序排序。

  • 须要多个字节的字符不包含ASCII范围内的任何字节值,以确保它们的一部分不会被误认为ASCII字符。 这也是一项安全功能。

  • UTF-8易于验证,而且能够经过验证器与其余字符编码区分开。 其余8位或多字节编码的文本也不多会验证为UTF-8。

  • 随机访问:在UTF-8字符串的任何点上,均可以判断该位置的字节是不是字符的第一个字节,而且能够回溯到该字符的开头,而无需引用任何内容。字符串的开始。

相关文章
相关标签/搜索