关于编码ANSI、GB2312、Unicode与UTF-8的区别
- 格式:doc
- 大小:32.00 KB
- 文档页数:2
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中的一些特殊字符进行编码,以便于在传输过程中不同的系统能够正确解析。
不同的编码格式介绍近⽇需要不同的编码,关于上述编码,⼀直迷迷糊糊,查了些资料,总算⼤致了解了,下⾯全是从⽹上搜来的:1. ASCII和Ansi编码字符内码(charcter code)指的是⽤来代表字符的内码.读者在输⼊和存储⽂档时都要使⽤内码,内码分为单字节内码 -- Single-Byte character sets (SBCS),可以⽀持256个字符编码.双字节内码 -- Double-Byte character sets)(DBCS),可以⽀持65000个字符编码.前者即为ASCII编码,后者对应ANSI.⾄于简体中⽂编码GB2312,实际上它是ANSI的⼀个代码页9362. Unicode 如上,ANSI有很多代码页,使⽤不同代码页的内码⽆法在其他代码也正常显⽰,这就是为什么⽇⽂版/繁体中⽂版游戏⽆法在简体中⽂平台直接显⽰的原因.Unicode也是⼀种字符编码⽅法,不过它是由国际组织设计,可以容纳全世界所有语⾔⽂字的编码⽅案.它是⼀种2字节编码,能够提供65536个字符,这个数字是不够表⽰所有的字符的(汉语就有55000多字符),所以,通过⼀个代理对的机制来实现附加的917,476个字符表⽰,以达到所有字符都具有唯⼀编码.3.Unicode和BigEndianUnicode这两者只是存储顺序不同,如"A"的unicode编码为65 00其BigEndianUnicode编码为00 654. UTF-8这是为传输⽽设计的编码,其系列还有UTF-7和UTF-16其中UTF-16和Unicode编码⼤致⼀样, UTF-8就是以8位为单元对Unicode进⾏编码。
从Unicode到UTF-8的编码⽅式如下: Unicode编码(16进制) UTF-8 字节流(⼆进制) 0000 - 007F 0xxxxxxx 0080 - 07FF 110xxxxx 10xxxxxx 0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx 例如“汉”字的Unicode编码是6C49。
关于编码ansi、GB2312、unicode与utf-8的区别先做一个小小的试验:在一个文件夹里,把一个txt文本(文本里包含“今天的天气非常好”这句话)分别另存为ansi、unicode、utf-8这三种编码的txt文件。
然后,在该文件夹上点击右键,选择“搜索(E)…”。
搜索“天气”二字,可以搜索出ansi和unicode这两种编码的txt文件,搜索不出utf-8编码的文件。
原因:1.中文操作系统默认ansi编码,生成的txt文件默认为ansi编码,所以,可以搜索出来。
2.unicode是国际通用编码,所以,可以搜索出来。
3.utf-8编码是unicode编码在网络之间(主要是网页)传输时的一种“变通”和“桥梁”编码。
utf-8在网络之间传输时可以节约数据量。
所以,使用操作系统无法搜索出txt文本。
按照utf-8创始人的愿望:端(unicode)——传输(utf-8)——端(unicode)但是,后来,许多网站开发者在开发网页时直接使用utf-8编码。
端(utf-8)——传输(utf-8)——端(utf-8)所以,在浏览器上看到的编码是:unicode(utf-8)。
正因为在浏览器上这么并列地列出unicode (utf-8),造成许多网友(甚至不少程序员)误认为unicode=utf-8。
其实,按照utf-8创始人的原意,在开发网页时使用utf-8编码是错误的做法,并且,早期的浏览器也不支持解析utf-8编码。
但是,众人的力量是巨大的,微软不得不“趋炎附势”,在浏览器上支持解析utf-8编码。
问题是:utf-8编码影响了网站开发者,或者说,网站开发者“扩展”了utf-8编码的使用范围。
但是,网站开发者仍然无法影响各类文档的开发者,所以,word文档和一些国际通用的文档仍然使用unicode编码而不使用utf-8编码。
比如:“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。
GB2312、GBK与UTF-8的区别这是一个异常经典的问题,有无数的新手站长每天都在百度这个问题,而我,作为一个“伪老手”站长,在明白这个这个问题的基础上,有必要详细的解答一下。
首先,我们要明白,GB2312、GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码。
只是对于我们中国人的网站来说,用这三种编码比较多。
简单的说一下,为什么要用编码,在计算机内,储存文本信息用ASC II码,每一个字符对应着唯一的ASCII码。
最初计算机是由美国发明的,他们也用的是键盘和上面的字母,所以他们的字符ASCII好解决。
但是我们中国的就不同了,每个汉字要对应唯一的ASCII码。
这样,就出来了国家制定的字符编码标准:GB2312、GBK等。
其他国家,其他语言也有他们对应的编码标准。
GB 就是国标的意思,GB2312和GBK主要用于汉字的编码,而UTF-8是全世界通用的。
意思就是说,如果你的网页主要面对使用汉语的中国人的话,使用GB2312和GBK非常好,文字储存体积要小,有一些优点。
如果你的网页要面向世界的话,你再用GB2312和GBK作为网页编码的话,有些电脑上的浏览器没有这种编码,你的网页汉字内容就会变成无法识别的乱码。
它们通常用在网页的meta标签内,例如:<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″/>,表示这个页面使用的是GB2312编码。
这个信息是给浏览器看的,浏览器会优先考虑使用从网页头部提取出来的编码信息对网页进行解码。
当然,我们也可以强制浏览器使用某种编码解释网页,这样我们就看到了传说中的乱码。
请看下图IE浏览器:百度首页使用的是GB2312编码,我们可以看到现在是正常的。
我们右击页面,选择“编码”->“其他”->“Unicode(UTF-8)”,意思就是强制浏览器使用UTF-8的编码方式解析页面,我们可以看到奇迹发生了:百度页面上所有的汉字都变成了乱码。
ANSI编码和UTF编码是两种不同的字符编码方式,它们有一些区别:
1.编码范围:ANSI编码使用一个字节(8位)来表示一个字符,
编码范围是0x00-0xFF,只能表示最多256个不同的字符。
而
UTF编码使用多个字节来表示一个字符,编码范围更大,可以
表示数百万个不同的字符。
2.字符集:ANSI编码主要基于ASCII字符集,只能表示基本的英
文字符和一些特殊字符,而不能表示其他语言(如中文、日文、韩文等)的字符。
而UTF编码可以表示包括中文、日文、韩文
在内的多种语言字符。
3.编码方式:ANSI编码是一种单字节编码方式,每个字符占用一
个字节,而UTF编码是一种多字节编码方式,根据不同的字符
使用1到4个字节来表示。
4.兼容性:由于ANSI编码是基于ASCII字符集的,因此与ASCII
码兼容。
而UTF编码与ASCII码不兼容。
总的来说,ANSI编码和UTF编码的主要区别在于编码范围、字符集、编码方式和兼容性等方面。
在实际使用中,根据需要选择合适的编码方式来处理不同语言的字符数据。
中文字符集的编码
中文字符集的编码标准有很多,其中最常见的是GB2312、GBK、
GB18030和UTF8。
这些编码标准主要用于处理中文字符在计算机中的表
示和存储。
GB2312,全称《信息交换用汉字编码字符集·基本集》,是中国国家强制
标准,包含了6763个常用汉字和非汉字字符。
该标准的字符集是分为两个区的,其中01-09区是特殊符号区,16-55区是一级汉字区,56-87区是
二级汉字区。
GBK是在GB2312的基础上扩大了更多汉字,支持繁体中文和部分其他语
言字符。
GB18030则是更全面的中文字符集,可以表示超过七万字,并且包括了许多不常见的汉字。
UTF8是一种变长字节表示的Unicode字符集,可以用来表示任何Unicode标准中的字符,包括中文字符。
总的来说,不同的编码标准适用于不同的应用场景,因此在处理中文字符时,需要根据实际需求选择合适的编码标准。
Unicode,GBK,GB2312,UTF-8概念基础(转载)第⼀篇:JAVA字符编码系列⼀:Unicode,GBK,GB2312,UTF-8概念基础本部分采⽤重⽤,转载⼀篇⽂章来完成这部分的⽬标。
来源:holen'blog 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解地址:/holen/archive/2004/11/30/188182.aspxUnicode:制定的编码机制, 要将全世界常⽤⽂字都函括进去.在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应⼀个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平⾯, 另外增加了16个位平⾯, 相当于20位编码, 编码范围0到0x10FFFF.UCS:ISO制定的ISO10646标准所定义的 Universal Character Set, 采⽤4byte编码.Unicode与UCS的关系:ISO与是两个不同的组织, 因此最初制定了不同的标准; 但⾃从unicode2.0开始, unicode采⽤了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持⼀致.UCS的编码⽅式:UCS-2, 与unicode的2byte编码基本⼀样.UCS-4, 4byte编码, ⽬前是在UCS-2前加上2个全零的byte.UTF: Unicode/UCS Transformation FormatUTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:* 与CPU字节顺序⽆关, 可以在不同平台之间交流* 容错能⼒⾼, 任何⼀个字节损坏后, 最多只会导致⼀个编码码位损失, 不会链锁错误(如GB码错⼀个字节就会整⾏乱码)UTF-16, 16bit编码, 是变长码, ⼤致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为⽹络传输的外码.UTF-16是unicode的preferred encoding.UTF-32, 仅使⽤了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的⼦集.UTF与unicode的关系:Unicode是⼀个字符集, 可以看作为内码.⽽UTF是⼀种编码⽅式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第⼀个byte都是0x00, 在操作系统(C语⾔)中有特殊意义, 会引起问题. 采⽤UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来⼀些优点.中国国标编码:GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改⽽同步更改.GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统⼀汉字部分, 并且增加了部分unicode中没有的字符.GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码, 地位等同于UTF-8, UTF-16, 是⼀种unicode编码形式. 变长编码, ⽤单字节/双字节/4字节对字符编码. GB18030向下兼容GB2312/GBK.GB 18030是中国所有⾮⼿持/嵌⼊式计算机系统的强制实施标准.-------------------------------什么是 UCS 和 ISO 10646?国际标准 ISO 10646 定义了通⽤字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的⼀个超集. 它保证与其他字符集是双向兼容的.就是说, 如果你将任何⽂本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息.UCS 包含了⽤于表达所有已知语⾔的字符. 不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中⽂, ⽇⽂和韩⽂这样的象形⽂字, 以及平假名, ⽚假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰⽶尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, ⽼挝语, 汉语拼⾳(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其他数也数不清的语. 对于还没有加⼊的语⾔, 由于正在研究怎样在计算机中最好地编码它们, 因⽽最终它们都将被加⼊. 这些语⾔包括 Tibetian, ⾼棉语, Runic(古代北欧⽂字), 埃塞俄⽐亚语, 其他象形⽂字, 以及各种各样的印-欧语系的语⾔, 还包括挑选出来的艺术语⾔⽐如 Tengwar, Cirth 和克林贡语(Klingon). UCS 还包括⼤量的图形的, 印刷⽤的, 数学⽤的和科学⽤的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符.ISO 10646 定义了⼀个 31 位的字符集. 然⽽, 在这巨⼤的编码空间中, 迄今为⽌只分配了前 65534 个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位⼦集称为基本多语⾔⾯ (Basic Multilingual Plane, BMP). 将被编码在 16 位 BMP 以外的字符都属于⾮常特殊的字符(⽐如象形⽂字), 且只有专家在历史和科学领域⾥才会⽤到它们. 按当前的计划, 将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的21 位的编码空间以外去了. ISO 10646-1 标准第⼀次发表于 1993 年, 定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第⼆部分 ISO 10646-2 正在准备中, 但也许要过好⼏年才能完成. 新的字符仍源源不断地加⼊到 BMP 中, 但已经存在的字符是稳定的且不会再改变了.UCS 不仅给每个字符分配⼀个代码, ⽽且赋予了⼀个正式的名字. 表⽰⼀个 UCS 或 Unicode 值的⼗六进制数, 通常在前⾯加上 "U+", 就象 U+0041 代表字符"拉丁⼤写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是⼀致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是⼀致的. 从U+E000 到 U+F8FF, 已经 BMP 以外的⼤范围的编码是为私⽤保留的.什么是组合字符?UCS⾥有些编码点分配给了组合字符.它们类似于打字机上的⽆间隔重⾳键. 单个的组合字符不是⼀个完整的字符. 它是⼀个类似于重⾳符或其他指⽰标记, 加在前⼀个字符后⾯. 因⽽, 重⾳符可以加在任何字符后⾯. 那些最重要的被加重的字符, 就象普通语⾔的正字法(orthographies of common languages)⾥⽤到的那种, 在 UCS ⾥都有⾃⼰的位置, 以确保同⽼的字符集的向后兼容性. 既有⾃⼰的编码位置, ⼜可以表⽰为⼀个普通字符跟随⼀个组合字符的被加重字符, 被称为预作字符(precomposed characters). UCS ⾥的预作字符是为了同没有预作字符的旧编码, ⽐如 ISO 8859, 保持向后兼容性⽽设的. 组合字符机制允许在任何字符后加上重⾳符或其他指⽰标记, 这在科学符号中特别有⽤, ⽐如数学⽅程式和国际⾳标字母, 可能会需要在⼀个基本字符后组合上⼀个或多个指⽰标记.组合字符跟随着被修饰的字符. ⽐如, 德语中的元⾳变⾳字符 ("拉丁⼤写字母A 加上分⾳符"), 既可以表⽰为 UCS 码 U+00C4 的预作字符, 也可以表⽰成⼀个普通 "拉丁⼤写字母A" 跟着⼀个"组合分⾳符":U+0041 U+0308 这样的组合. 当需要堆叠多个重⾳符, 或在⼀个基本字符的上⾯和下⾯都要加上组合标记时, 可以使⽤多个组合字符. ⽐如在泰国⽂中, ⼀个基本字符最多可加上两个组合字符.什么是 UCS 实现级别?不是所有的系统都需要⽀持象组合字符这样的 UCS ⾥所有的先进机制. 因此 ISO 10646 指定了下列三种实现级别:级别1不⽀持组合字符和 Hangul Jamo 字符 (⼀种特别的, 更加复杂的韩国⽂的编码, 使⽤两个或三个⼦字符来编码⼀个韩⽂⾳节)级别2类似于级别1, 但在某些⽂字中, 允许⼀列固定的组合字符 (例如, 希伯来⽂, 阿拉伯⽂, Devangari, 孟加拉语, 果鲁穆奇语, Gujarati, Oriya, 泰⽶尔语, Telugo, 印.埃纳德语, Malayalam, 泰国语和⽼挝语). 如果没有这最起码的⼏个组合字符, UCS 就不能完整地表达这些语⾔.级别3⽀持所有的 UCS 字符, 例如数学家可以在任意⼀个字符上加上⼀个 tilde(颚化符号,西班⽛语字母上⾯的~)或⼀个箭头(或两者都加).什么是 Unicode?历史上, 有两个独⽴的, 创⽴单⼀字符集的尝试. ⼀个是国际标准化组织(ISO)的 ISO 10646 项⽬, 另⼀个是由(⼀开始⼤多是美国的)多语⾔软件制造商组成的协会组织的 Unicode 项⽬. 幸运的是, 1991年前后, 两个项⽬的参与者都认识到, 世界不需要两个不同的单⼀字符集. 它们合并双⽅的⼯作成果, 并为创⽴⼀个单⼀编码表⽽协同⼯作. 两个项⽬仍都存在并独⽴地公布各⾃的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.那么 Unicode 和 ISO 10646 不同在什么地⽅?Unicode 协会公布的 Unicode 标准严密地包含了 ISO 10646-1 实现级别3的基本多语⾔⾯. 在两个标准⾥所有的字符都在相同的位置并且有相同的名字.Unicode 标准额外定义了许多与字符有关的语义符号学, ⼀般⽽⾔是对于实现⾼质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语⾔(⽐如阿拉伯语)表达形式的算法, 处理双向⽂字(⽐如拉丁与希伯来⽂混合⽂字)的算法和排序与字符串⽐较所需的算法, 以及其他许多东西.另⼀⽅⾯, ISO 10646 标准, 就象⼴为⼈知的 ISO 8859 标准⼀样, 只不过是⼀个简单的字符集表. 它指定了⼀些与标准有关的术语, 定义了⼀些编码的别名, 并包括了规范说明, 指定了怎样使⽤ UCS 连接其他 ISO 标准的实现, ⽐如 ISO 6429 和 ISO 2022. 还有⼀些与 ISO 紧密相关的, ⽐如 ISO 14651 是关于 UCS 字符串排序的.考虑到 Unicode 标准有⼀个易记的名字, 且在任何好的书店⾥的 Addison-Wesley ⾥有, 只花费 ISO 版本的⼀⼩部分, 且包括更多的辅助信息, 因⽽它成为使⽤⼴泛得多的参考也就不⾜为奇了. 然⽽, ⼀般认为, ⽤于打印 ISO 10646-1 标准的字体在某些⽅⾯的质量要⾼于⽤于打印 Unicode 2.0的. 专业字体设计者总是被建议说要两个标准都实现, 但⼀些提供的样例字形有显著的区别. ISO 10646-1 标准同样使⽤四种不同的风格变体来显⽰表意⽂字如中⽂, ⽇⽂和韩⽂ (CJK), ⽽ Unicode 2.0 的表⾥只有中⽂的变体. 这导致了普遍的认为 Unicode 对⽇本⽤户来说是不可接收的传说, 尽管是错误的.什么是 UTF-8?⾸先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好⼏种将⼀串字符表⽰为⼀串字节的⽅法. 最显⽽易见的两种⽅法是将 Unicode ⽂本存储为 2 个或 4 个字节序列的串. 这两种⽅法的正式名称分别为 UCS-2 和 UCS-4. 除⾮另外指定, 否则⼤多数的字节都是这样的(Bigendian convention). 将⼀个 ASCII 或 Latin-1 的⽂件转换成 UCS-2 只需简单地在每个 ASCII 字节前插⼊ 0x00. 如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插⼊三个 0x00.在 Unix 下使⽤ UCS-2 (或 UCS-4) 会导致⾮常严重的问题. ⽤这些编码的字符串会包含⼀些特殊的字符, ⽐如 '/0' 或 '/', 它们在⽂件名和其他 C 库函数参数⾥都有特别的含义. 另外, ⼤多数使⽤ ASCII ⽂件的 UNIX 下的⼯具, 如果不进⾏重⼤修改是⽆法读取 16 位的字符的. 基于这些原因, 在⽂件名, ⽂本⽂件, 环境变量等地⽅, UCS-2 不适合作为 Unicode 的外部编码.在 ISO 10646-1 Annex R 和 RFC 2279 ⾥定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操作系统下使⽤ Unicode 的明显的⽅法.UTF-8 有⼀下特性:UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的⽂件在 ASCII 和 UTF-8 两种编码⽅式下是⼀样的.所有 >U+007F 的 UCS 字符被编码为⼀个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的⼀部分.表⽰⾮ ASCII 字符的多字节串的第⼀个字节总是在 0xC0 到 0xFD 的范围⾥, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到0xBF 范围⾥. 这使得重新同步⾮常容易, 并使编码⽆国界, 且很少受丢失字节的影响.可以编⼊所有可能的 231个 UCS 代码UTF-8 编码字符理论上可以最多到 6 个字节长, 然⽽ 16 位 BMP 字符最多只⽤到 3 字节长.Bigendian UCS-4 字节串的排列顺序是预定的.字节 0xFE 和 0xFF 在 UTF-8 编码中从未⽤到.下列字节串⽤来表⽰⼀个字符. ⽤到哪个串取决于该字符在 Unicode 中的序号.U-00000000 - U-0000007F: 0xxxxxxxU-00000080 - U-000007FF: 110xxxxx 10xxxxxxU-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxxU-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxU-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxU-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxxxx 的位置由字符编码数的⼆进制表⽰的位填⼊. 越靠右的 x 具有越少的特殊意义. 只⽤最短的那个⾜够表达⼀个字符编码数的多字节串. 注意在多字节串中, 第⼀个字节的开头"1"的数⽬就是整个串中字节的数⽬.例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 ⾥的编码为:11000010 10101001 = 0xC2 0xA9⽽字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0这种编码的官⽅名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何⽂档中⽤其他名字 (⽐如 utf8 或 UTF_8) 来表⽰ UTF-8,当然除⾮你指的是⼀个变量名⽽不是这种编码本⾝.什么编程语⾔⽀持 Unicode?在⼤约 1993 年之后开发的⼤多数现代编程语⾔都有⼀个特别的数据类型, 叫做 Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.ISO C 也详细说明了处理多字节编码和宽字符 (wide characters) 的机制, 1994 年 9 ⽉ Amendment 1 to ISO C 发表时⼜加⼊了更多. 这些机制主要是为各类东亚编码⽽设计的, 它们⽐处理 UCS 所需的要健壮得多. UTF-8 是 ISO C 标准调⽤多字节字符串的编码的⼀个例⼦, wchar_t 类型可以⽤来存放Unicode 字符.---------------------作者:qinysong来源:CSDN原⽂:https:///qinysong/article/details/1179480版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接!。
关于编码ANSI、GB2312、Unicode与UTF-8的区别
先做一个小小的试验:
在一个文件夹里,把一个txt文本(文本里包含“今天的天气非常好”这句话)分别另存为ANSI、Unicode、UTF-8这三种编码的txt文件。
然后,在该文件夹上点击右键,选择“搜索(E)…”。
搜索“天气”二字,可以搜索出ANSI和Unicode这两种编码的txt文件,搜索不出UTF-8编码的文件。
(不一定)
原因:
1.中文操作系统默认ANSI编码,生成的txt文件默认为ANSI编码,所以,可以搜索出来。
2.Unicode是国际通用编码,所以,可以搜索出来。
3.UTF-8编码是Unicode编码在网络之间(主要是网页)传输时的一种“变通”和“桥梁”编码。
UTF-8在网络之间传输时可以节约数据量。
所以,使用操作系统无法搜索出txt文本。
(UTF-8表示的大部分字符是西文字符时,可以节约数据量;如果大部分字符是非西文字符,反而会增大数据量。
)
按照UTF-8创始人的愿望:
端(Unicode)——传输(UTF-8)——端(Unicode)
但是,后来,许多网站开发者在开发网页时直接使用UTF-8编码。
端(UTF-8)——传输(UTF-8)——端(UTF-8)
所以,在浏览器上看到的编码是:Unicode(UTF-8)。
正因为在浏览器上这么并列地列出Unicode(UTF-8),造成许多网友(甚至不少程序员)误认为Unicode=UTF-8。
其实,按照UTF-8创始人的原意,在开发网页时使用UTF-8编码是错误的做法,并且,早期的浏览器也不支持解析UTF-8编码。
但是,众人的力量是巨大的,微软不得不“趋炎附势”,在浏览器上支持解析UTF-8编码。
问题是:UTF-8编码影响了网站开发者,或者说,网站开发者“扩展”了UTF-8编码的使用范围。
但是,网站开发者仍然无法影响各类文档的开发者,所以,Word 文档和一些国际通用的文档仍然使用Unicode编码而不使用UTF-8编码。
比如:“严”的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。
在中文和日文操作系统里生成的(txt和xml)文件的编码虽然都是ANSI,但是,在简体中文系统下,ANSI 编码代表 GB2312 编码;在繁体中文系统下,ANSI 编码代表 Big5 编码;在日文操作系统下,ANSI 编码代表 JIS 编码。
不
同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
结论:国际文档(txt和xml)使用Unicode编码是正宗做法;操作系统和浏览器都能够“理解”Unicode编码。
浏览器“迫于压力”才“理解”UTF-8编码。
但是,操作系统有时只认Unicode编码。
Unicode与Unicode big endian的区别:你吃鸡蛋时先吃小头还是先吃大头?Unicode与Unicode big endian的区别就是在编码时小头优先与大头优先的区别。
“随波逐流”使用Unicode就OK了。
我(不是程序员)这几年一直因为编码问题,感到非常困惑,查了许多资料,在国际文档的实际应用中也遇到过许多问题,所以,“感性”地总结了上述观点,不一定准确(或者说,不一定正确)。
ANSI(American National Standards Institution 美国国家标准学会)相当于是各地区字符编码的别名,目的是为了兼容已经既成事实的各地区字符编码集。
因为Unicode是在各地区字符编码集(如中文的GB系列编码,繁文的Big5编码,日文的JIS编码等等)之后才出现的,而Windows在采用Unicode的时候要考虑和各国已有字符编码兼容,因此“中文版Windows操作系统”中的默认编码仍然采用GB系列编码;“繁体版Windows操作系统”中的默认编码仍然采用Big5编码;“日文版Windows操作系统”中的默认编码仍然采用JIS编码。
而这些地区性编码在美国的MS公司看起来,它们都被统称为ANSI编码了。