字符编码简介:ASCII,Unicode,UTF-8,GB2312
- 格式:doc
- 大小:41.50 KB
- 文档页数:7
Python的ASCII,GB2312,Unicode,UTF-8相互转换ASCII 是⼀种字符集,包括⼤⼩写的英⽂字母、数字、控制字符等,它⽤⼀个字节表⽰,范围是 0-127 Unicode分为UTF-8和UTF-16。
UTF-8变长度的,最多 6 个字节,⼩于 127 的字符⽤⼀个字节表⽰,与 ASCII 字符集的结果⼀样,ASCII 编码下的英语⽂本不需要修改就可以当作 UTF-8 编码进⾏处理。
Python 从 2.2 开始⽀持 Unicode ,函数 decode( char_set )可以实现其它编码到 Unicode 的转换,函数 encode( char_set )实现 Unicode 到其它编码⽅式的转换。
⽐如("你好").decode( "GB2312")将得到u'\u4f60\u597d',即 "你"和“好"的 Unicode 码分别是 0x4f60 和 0x597d再⽤(u'\u4f60\u597d').encode("UTF-8")将得到'\xe4\xbd\xa0\xe5\xa5\xbd'它是 “你好”的UTF-8编码结果。
python中使⽤ unicode的关键:unicode是⼀个类,函数unicode(str,"utf8")从utf8编码(当然也可以是别的编码)的字符串str⽣成 unicode类的对象,⽽函数unc.encode("utf8")将unicode类的对象unc转换为(编码为)utf8编码(当然也可以是别的编码)的字符串。
于是,编写unicode相关程序,需要做的事情是 * 获取数据(字符串)时,⽤unicode(str, "utf8")⽣成unicode对象 * 在程序中仅使⽤unicode对象,对程序中出现的字符串常量都以u"字符串"的形式书写 * 输出时,可将unicode对象转换为任意编码输出,使⽤str.encode("some_encoding")>>> unicode("你好", "utf8")u'\u4f60\u597d'>>> x = _>>> type(x)>>> type("你好")>>> x.encode("utf8")'\xe4\xbd\xa0\xe5\xa5\xbd'>>> x.encode("gbk")'\xc4\xe3\xba\xc3'>>> x.encode("gb2312")'\xc4\xe3\xba\xc3'>>> print x你好>>> print x.encode("utf8")你好>>> print x.encode("gbk")以上是测试结果(Ubuntu 6.06,locale为utf8),注意type(x)和type("你好")的区别。
常用编码方式常用编码方式编码是人类通讯的一种基本方式,对于计算机而言,为了能够处理和保存各种类型的数据,也需要有一种统一的编码方式。
以下是常用的几种编码方式:一、ASCII编码ASCII编码是美国信息交换标准代码的缩写,是一种基于拉丁字母的编码方式。
它定义了128个字符,包括数字、字母、标点符号和一些控制字符。
由于只有128个字符,存储效率和传输效率比较高,但是只能表示英文字符,不能表示汉字等其他语言的字符。
二、Unicode编码Unicode编码是国际组织制定的一种万国码,目的就是解决计算机处理多语言的问题。
Unicode编码采用32位编码方式,可以表示2^32个字符,不仅包括了世界上所有的语言文字,还包括了一些图形符号、表情符号等特殊符号。
三、UTF-8编码UTF-8编码是一种对Unicode编码进行转换的编码方式。
UTF-8编码采用变长编码方式,能够同样表示所有Unicode字符,但是在表示英文字符时只需要一个字节,而对于中文等其他常用字符采用3个字节表示,使得存储效率和传输效率都得到了优化。
四、GB2312编码GB2312编码是中国制定的中文编码方式,采用双字节编码,共收录了6763个汉字和682个非汉字字符。
GB2312编码虽然不能够表示所有的中文字符,但是对于一般的中文书写和交流已经够用。
在此基础之上,GB18030编码进行了扩充,可以表示Unicode完整字符集,包括了中文和其他字符。
五、Base64编码Base64编码是一种基于64个可打印字符的编码方式,常用于在数据传输时对二进制数据进行编码,以便于传输。
Base64编码可以将任何类型的数据转换为可打印的ASCII字符,但编码后会把数据长度增加到原来的4/3倍,这会造成一定程度上的数据冗余,在传输速度和存储空间中需要平衡考量。
六、URL编码URL编码是指对URL中的一些特殊字符进行编码,以便于在传输过程中不同的系统能够正确解析。
汉字编码字符集汉字编码字符集是指用于表示和存储汉字的一套编码系统。
在计算机领域,为了能够准确地表示和处理汉字,人们设计了多种不同的汉字编码字符集。
本文将介绍几种常见的汉字编码字符集,包括GB2312、GBK、Unicode以及UTF-8。
一、GB2312GB2312是中国国家标准局于1980年发布的一种汉字编码字符集,是最早被广泛使用的汉字字符集之一。
GB2312字符集包含了7445个汉字和682个非汉字字符,采用双字节表示每个字符。
其中,第一个字节的范围是0xB0至0xF7,第二个字节的范围是0xA1至0xFE。
GB2312字符集主要适用于简体中文。
二、GBK随着计算机技术的发展和汉字数量的增加,GB2312字符集的容量已经无法满足需求。
为了解决这个问题,国家标准局于1995年发布了GBK字符集,它是对GB2312字符集的扩充和改进。
GBK字符集兼容GB2312字符集,同时加入了21003个汉字,总计包含了21886个汉字。
GBK字符集同样采用双字节表示每个字符,第一个字节的范围是0x81至0xFE,第二个字节的范围是0x40至0xFE。
GBK字符集支持简体中文和繁体中文。
三、UnicodeUnicode是一种国际标准字符集,旨在为全球所有字符提供唯一的编码。
Unicode采用16位的编码方案,可以支持最多65536个不同的字符。
不仅包括了各个国家语言的文字,还包括了数学符号、技术符号、图形符号等。
Unicode字符集为各种语言的文字提供了一个统一的编码标准。
四、UTF-8UTF-8是一种可变长度的Unicode编码方案,更好地解决了存储效率和兼容性的问题。
UTF-8使用1至4个字节来表示一个字符,根据不同的字符而变化。
对于单字节的字符,编码和ASCII码相同,兼容ASCII码。
对于多字节的字符,第一个字节的高位标识了字节数。
UTF-8字符集可以表示Unicode字符集中的所有字符。
在计算机系统中,为了使不同的系统能够正确地处理汉字编码,一般需要统一选择一种字符集来使用。
计算机的常用编码规则
计算机的常用编码规则有以下几种:
1. ASCII(American Standard Code for Information Interchange):ASCII码是用于字符编码的一种规则,它使用7位二进制数表示128个字符,包括英文字母、数字、标点符号以及一些控制字符。
ASCII码规定了每个字符对应的唯一编码。
2. Unicode(统一码或万国码):Unicode是一种字符集,包含了世界上几乎所有的字符,包括各国文字、标点符号、特殊符号等等。
Unicode采用16位或32位的二进制数表示字符,提供了一个全球通用的字符编码标准。
3. UTF-8(Unicode Transformation Format 8-bit):UTF-8是一种Unicode的变长字符编码方式,它使用1至4个字节来表示一个字符,能够表示全世界所有的字符。
在ASCII字符范围内,UTF-8与ASCII完全兼容。
4. GB2312(中国国家标准简体中文字符集):GB2312是一个简体中文字符集,是中国国家标准规定的字符编码,使用2个字节来表示一个中文字符,包含了汉字以及一些常用的符号。
5. GBK:GBK是中国国家标准规定的字符编码,是对
GB2312的扩展,支持更多的字符(包括繁体中文字符等),使用1或2个字节来表示一个字符。
这些编码规则在计算机中常被用来处理文本、存储字符数据以及各种通信协议中的字符编码。
不同的编码规则各有优劣,选择合适的编码规则取决于应用场景和需求。
简述汉字的4种编码汉字作为世界上最古老的文字之一,有着悠久的历史。
为了方便计算机处理和传输汉字,人们设计了多种编码方式。
下面将简述汉字的主要四种编码。
1. ASCII编码(American Standard Code for Information Interchange,美国信息交换标准代码):ASCII是最早的一种字符编码,用于表示拉丁字母和一些常用符号。
由于最初是由美国发明的,所以只包含128个字符,包括大小写字母、数字、标点符号等。
ASCII编码对于汉字是不适用的,因此在中国不能完整地表示汉字。
2. GB2312编码:GB2312是中国国家标准局于1980年发布的汉字编码标准,它是一种双字节编码,用于表示汉字和少量非汉字字符。
GB2312编码共收录了7445个常用汉字和682个非汉字字符。
GB2312编码是汉字的首次正式编码,为后来的汉字编码奠定了基础。
3. GBK编码:GBK是GB2312编码的扩展,由中国国家标准局于1995年发布。
GBK编码兼容GB2312,并进一步扩展了汉字字符集,收录了21003个汉字和8829个非汉字字符。
GBK编码是目前广泛使用的汉字编码,支持绝大多数汉字字符。
4. Unicode编码:Unicode是国际标准化组织(ISO)制定的一种字符编码标准,用于表示全球范围内的所有字符。
Unicode编码采用了固定的编码格式,可以表示从汉字到其他任何文字的字符。
Unicode编码采用不同的实现方式,最常见的有UTF-8、UTF-16和UTF-32等。
其中,UTF-8编码是一种可变长度编码,用来表示Unicode字符集中的字符,它将每个字符映射为一个或多个字节,广泛应用于互联网和计算机系统。
总结起来,汉字的编码方式经历了从最早的ASCII编码到GB2312、GBK和Unicode编码的发展演变。
随着计算机和互联网的普及,Unicode编码成为了汉字编码的主流,尤其是UTF-8编码,在国际化和跨平台应用中被广泛使用。
字符和汉字编码一、字符集编码字符集编码是指将字符集中的字符转换为计算机可识别的二进制编码。
常见的字符集编码包括ASCII编码、GB2312编码、GBK编码、UTF-8编码等。
1. ASCII编码:ASCII编码是最常用的字符集编码,它包含了128个字符,每个字符用一个字节的二进制数表示。
2. GB2312编码:GB2312编码是中国大陆使用的字符集编码,它包含了6763个汉字和一些其他的字符。
3. GBK编码:GBK编码是中国大陆使用的扩展字符集编码,它包含了20902个汉字和一些其他的字符。
4. UTF-8编码:UTF-8编码是一种可变长度的字符集编码,它包含了几乎所有的语言字符,包括汉字。
二、汉字编码汉字编码是指将汉字转换为计算机可识别的二进制编码。
常见的汉字编码包括GB2312编码、GBK编码、UTF-8编码等。
1. GB2312编码:GB2312编码是中国大陆使用的汉字编码,它包含了6763个汉字。
2. GBK编码:GBK编码是中国大陆使用的扩展汉字编码,它包含了20902个汉字。
3. UTF-8编码:UTF-8编码是一种可变长度的汉字编码,它包含了几乎所有的语言字符,包括汉字。
三、字符和汉字的输入方法字符和汉字的输入方法包括键盘输入、手写输入、语音输入等。
1. 键盘输入:通过键盘输入字符和汉字,是最常用的输入方法。
2. 手写输入:通过手写输入汉字,通常需要使用专门的识别软件。
3. 语音输入:通过语音输入汉字,通常需要使用语音识别软件。
四、字体和字形的表示字体和字形的表示包括矢量字体和点阵字体。
矢量字体是一种数学描述的字体,可以无损放大;点阵字体是一种像素点的集合,放大后会出现失真。
五、编码标准编码标准是指制定字符集编码和汉字编码的规范和标准。
中国制定了《信息交换用汉字编码字符集》等标准,国际上制定了ISO/IEC 10646等标准。
六、字符和汉字的输出方法字符和汉字的输出方法包括屏幕输出、打印机输出、文件输出等。
中文编码解析中文编码解析是指将中文字符转换为计算机可识别的数字编码的过程。
常见的中文编码方式包括UTF-8、GBK、GB2312和BIG5等。
1. UTF-8(Unicode Transformation Format-8 bits):UTF-8是一种可变长度的字符编码方式,可以表示任何Unicode标准中的字符。
UTF-8编码的字符以1到4个字节表示,最多可以表示21位的数字。
UTF-8编码是目前互联网上最常见的编码方式之一,因为它可以兼容ASCII 编码,并且支持全球范围内的语言文字。
2. GBK(GuóBǐng Kǎo):GBK是一种双字节字符编码方式,用于简体中文。
它兼容GB2312编码,但支持更多的字符集。
GBK编码的字符以1到2个字节表示,最多可以表示16位的数字。
3. GB2312(GuóBǐng 2312):GB2312是一种单字节字符编码方式,用于简体中文。
它支持6000多个常用汉字和一些标点符号、数字和字母。
GB2312编码的字符以1个字节表示,最多可以表示94位的数字。
4. BIG5(Bǐng Wén GuóTōng):BIG5是一种双字节字符编码方式,用于繁体中文。
它兼容GB2312编码,但支持更多的字符集。
BIG5编码的字符以1到2个字节表示,最多可以表示16位的数字。
在进行中文编码解析时,需要先将中文字符转换为相应的编码方式,然后再进行传输或存储。
在接收或读取时,需要将编码方式还原为中文字符,以便正确显示或处理。
常见的中文编码解析工具包括iconv、libiconv等。
中文编码解析是指将中文字符转换为计算机可识别的数字编码的过程。
常见的中文编码方式包括UTF-8、GBK、GB2312和BIG5等。
1. UTF-8(Unicode Transformation Format-8 bits):UTF-8是一种可变长度的字符编码方式,可以表示任何Unicode标准中的字符。
计算机常用编码一、字符编码字符编码是将字符集中的每个字符与一个唯一的数字码相对应的过程。
常见的字符编码标准包括ASCII码、Unicode、GB2312、GBK和UTF-8等。
ASCII码是最早的字符编码标准,它将128个字符分配了0-127的码值。
Unicode则是一个跨平台的字符编码标准,它为每个字符提供了一个唯一的码值,适用于国际化的应用。
GB2312和GBK是中国常用的字符编码标准,支持中文字符的编码。
UTF-8是一种可变长度字符编码,它支持多种语言字符,并且兼容ASCII码。
二、数值编码数值编码是指将数值数据转换为二进制或其他进制表示的过程。
常见的数值编码方式包括二进制、十进制、十六进制等。
二进制是计算机内部处理数据的格式,所有的信息都被表示成二进制形式。
十进制是我们日常使用的数字表示方式,而十六进制则是一种简化的数字表示方式,它使用数字0-9和字母A-F来表示数值。
三、图像编码图像编码是指将图像数据转换为二进制或其他进制表示的过程。
常见的图像编码方式包括JPEG、PNG、BMP等。
JPEG是一种有损压缩的图像编码格式,广泛应用于网络和多媒体应用中。
PNG是一种无损压缩的图像编码格式,支持透明度和渐变效果。
BMP是一种简单的图像编码格式,它是未经压缩的位图格式。
四、音频编码音频编码是指将音频数据转换为二进制或其他进制表示的过程。
常见的音频编码方式包括MP3、AAC、WAV等。
MP3是一种有损压缩的音频编码格式,广泛应用于音乐和语音的存储和传输中。
AAC是一种高级音频编码格式,支持更高的音质和更高效的压缩。
WAV是一种无损压缩的音频编码格式,支持多种音频采样率和位深度。
五、视频编码视频编码是指将视频数据转换为二进制或其他进制表示的过程。
常见的视频编码方式包括MPEG、AVI、MOV等。
MPEG是一种有损压缩的视频编码格式,广泛应用于视频存储和传输中。
AVI是一种无损压缩的视频编码格式,支持多种视频分辨率和帧率。
计算机常用的编码一、字符编码字符编码是用于将字符集(如英文字母、数字、标点符号等)转换为计算机可以理解的二进制数的一种方式。
以下是几种常见的字符编码:1.ASCII码:ASCII码是用于将字符集转换为二进制数的标准编码方式。
它包含了128个不同的字符,每个字符由7位二进制数表示。
2.Unicode:Unicode是一种国际化的字符编码标准,它包含了世界上几乎所有语言的字符。
每个Unicode字符由16位二进制数表示。
3.GB2312和GBK:GB2312是中国国家强制标准,包含了6000多个常用汉字和英文符号。
GBK是在GB2312基础上扩展的,包含了更多的汉字和符号。
4.UTF-8:UTF-8是一种可变长度的字符编码,它能够表示任何Unicode字符。
UTF-8编码的每个字符由1到4个字节表示,对于英文字母和数字,UTF-8编码与ASCII码相同。
二、数值编码数值编码是用于将数值转换为二进制数的一种方式。
以下是几种常见的数值编码:1.二进制:二进制是最简单的数值编码方式,只有0和1两种状态。
2.十进制:十进制是我们日常使用的数值编码方式,它有0到9共10个数字。
3.十六进制:十六进制是一种简化的数值编码方式,它有0到9和A到F共16个数字。
在计算机科学中,十六进制常用于表示二进制数的简写方式。
三、图像编码图像编码是将图像数据转换为二进制数的一种方式。
以下是几种常见的图像编码:1.JPEG:JPEG是一种常用的图像压缩标准,它采用有损压缩算法,能够在保证图像质量的前提下,大大减少图像数据的存储空间。
2.PNG:PNG是一种无损压缩的图像格式,它能够保留原始图像的所有信息,并且在压缩后不失真。
PNG广泛应用于网页设计、软件界面设计等领域。
3.GIF:GIF是一种基于LZW算法的压缩图像格式,它可以支持动态图像和透明背景。
GIF广泛应用于网页中的动画、图标等设计。
四、音频编码音频编码是将音频数据转换为二进制数的一种方式。
常用编码方式编码是计算机中数据的表示、传输和存储的规则和方法,它是计算机能够正确处理和显示各种数据的基础。
常用的编码方式有 ASCII码、Unicode、UTF-8、UTF-16、GB2312等。
下面将对这些编码方式进行详细介绍。
ASCII码是最早的字符编码标准,它使用7位二进制数表示字符,共计128个字符,包括数字、字母、标点符号和特殊控制字符等。
然而,ASCII码只能表示英文字符,对于其他语言的字符则无法表示。
为了解决ASCII码的不足,Unicode 应运而生。
Unicode采用全球唯一的字符编码标准,为世界上几乎所有的字符都分配了一个唯一的数字编码,使不同语言和字符集都能得到支持。
最初,Unicode使用两个字节(16位)来表示一个字符,每个字符的编码范围从0x0000到0xFFFF。
然而,由于Unicode标准中有上千万个字符需要表示,两个字节的表示范围不够,因此产生了UTF-16和UTF-8这两种编码方式。
UTF-16是Unicode的扩展编码方式之一,使用定长的16位(两个字节)来表示一个字符。
对于非英文字符,UTF-16需要使用两个或四个字节来表示。
UTF-16编码方式在存储和传输中存在一些问题,因为它不能很好地处理文本中的字节顺序标记(Byte Order Mark,BOM)。
于是,UTF-8应运而生。
UTF-8 是一种变长编码,使用 1~4 个字节来表示一个字符。
对于单字节的字符,UTF-8 和 ASCII兼容,即UTF-8编码的文本可以在 ASCII 编码下正常显示。
对于非英文字符,UTF-8 使用多个字节进行编码,根据字符的实际需要来增加字节长度。
因此,UTF-8 编码能够在表示全球各个地区的字符时保持极佳的兼容性。
除了ASCII、Unicode和UTF-8之外,还有一些用于中文字符集的编码方式,如GB2312、GBK、GB18030等。
GB2312 是中国国家标准简体中文字符集,使用双字节来表示每个字符。
字符编码简介:ASCII,Unicode,UTF-8,GB2312字符编码简介:ASCII,Unicode,UTF-8,GB23121. ASCII码我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。
每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。
也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。
这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。
这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。
比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。
于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。
比如,法语中的é的编码为130(二进制10000010)。
这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但是,这里又出现了新的问题。
不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。
比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。
但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。
至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。
一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。
比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。
中文编码的问题需要专文讨论,这篇笔记不涉及。
这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。
3、UnicodeUnicode字符集(简称为UCS),国际标准组织于1984年4月成立ISO/IEC JTC1/SC2/WG2工作组,针对各国文字、符号进行统一性编码。
1991年美国跨国公司成立Unicode Consortium,并于1991年10月与WG2达成协议,采用同一编码字集。
目前Unicode是采用16位编码体系,其字符集内容与ISO10646的BMP(Basic Multilingual Plane)相同。
Unicode于1992年6月通过DIS(Draf International Standard),目前版本V2.0于1996公布,内容包含符号6811个,汉字20902个,韩文拼音11172个,造字区6400个,保留20249个,共计65534个。
Unicode编码后的大小是一样的.例如一个英文字母"a" 和一个汉字"好",编码后都是占用的空间大小是一样的,都是两个字节!Unicode可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。
所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。
不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母'a'为"00 61"。
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。
每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。
具体的符号对应表,可以查询,或者专门的汉字对应表。
/tool/CJK.htm4. Unicode的问题需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
比如,汉字“严”的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。
表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。
这里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
它们造成的结果是:1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。
2)unicode在很长一段时间内无法推广,直到互联网的出现。
5.UTF-8互联网的普及,强烈要求出现一种统一的编码方式。
UTF-8就是在互联网上使用最广的一种unicode的实现方式。
其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。
重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。
它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。
因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。
剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode符号范围| UTF-8编码方式(十六进制) | (二进制)--------------------+---------------------------------------------0000 0000-0000 007F | 0xxxxxxx0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx下面,还是以汉字“严”为例,演示如何实现UTF-8编码。
已知“严”的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。
然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。
这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。
6. Unicode与UTF-8之间的转换通过上一节的例子,可以看到“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。
它们之间的转换可以通过程序实现。
在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。
打开文件后,点击“文件”菜单中的“另存为”命令,会跳出一个对话框,在最底部有一个“编码”的下拉条。
里面有四个选项:ANSI,Unicode,Unicode big endian 和UTF-8。
1)ANSI是默认的编码方式。
对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows 简体中文版,如果是繁体中文版会采用Big5码)。
2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。
这个选项用的little endian 格式。
3)Unicode big endian编码与上一个选项相对应。
我在下一节会解释little endian和big endian的涵义。
4)UTF-8编码,也就是上一节谈到的编码方法。
选择完”编码方式“后,点击”保存“按钮,文件的编码方式就立刻转换好了。
7. Little endian和Big endian上一节已经提到,Unicode码可以采用UCS-2格式直接存储。
以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。
存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E 在后,就是Little endian方式。
这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。
在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。
为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。
因此,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。
那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。
这正好是两个字节,而且FF比FE大1。
如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。
8. 实例下面,举一个实例。
打开”记事本“程序Notepad.exe,新建一个文本文件,内容就是一个”严“字,依次采用ANSI,Unicode,Unicode big endian 和UTF-8编码方式保存。
然后,用文本编辑软件UltraEdit中的”十六进制功能“,观察该文件的内部编码方式。