根据Wikipedia UTF-8页面,我听到人们的意见不一致。 python
他们是同一回事,不是吗? 有人能够澄清吗? 安全
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
现有的答案已经解释了不少细节,但这是一个简短的答案,其中包含最直接的说明和示例。 排序
Unicode是将字符映射到代码点的标准 。
每一个字符都有一个惟一的代码点(标识号),这是一个数字,例如9731。
UTF-8是码点的编码 。
为了将全部字符存储在磁盘上(在文件中),UTF-8将字符分红最多4个八位字节(8位序列)-字节。 UTF-8是几种编码(表示数据的方法)之一。 例如,在Unicode中,(十进制)代码点9731表示一个雪人( ☃
),它由UTF-8中的3个字节组成: E2 98 83
世界各地有不少字符,例如“ $,&,h,a,t,?,张,1,=,+ ...”。
而后是一个致力于这些角色的组织,
他们制定了一个称为“ Unicode”的标准。
标准以下:
PS:固然,还有另外一个名为ISO的组织正在维护另外一个标准-“ ISO 10646”,几乎相同。
如上所述,U + 0024只是一个位置,所以咱们没法在计算机中为字符“ $”保存“ U + 0024”。
必须有一种编码方法。
而后是编码方法,例如UTF-8,UTF-16,UTF-32,UCS-2 ....
在UTF-8下,代码点“ U + 0024”被编码为00100100。
00100100是咱们在计算机中为“ $”保存的值。
让我用一个例子来讲明这个话题:
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中学习此主题, 请单击此处
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字符串的任何点上,均可以判断该位置的字节是不是字符的第一个字节,而且能够回溯到该字符的开头,而无需引用任何内容。字符串的开始。