Unicode万国码、UTF8、GB2312、GBK、ISO-8859-1
Unicode(一、、一、)是科域的一界,用以一地呈和理世界上大部分的文字系,其。
Unicode依照通用字符集(Universal Character Set)的展,同也以本的形式外表。Unicode至今仍在不增,每新版本都加入更多新的字符。目前最新的Unicode第六版,除了已入超十字符(Unicode的第十字符在2005年,且可成之一),包含可用作考的代表、方法、的字符,以及了如大小字母等字符特性的列表些料。
在文字理方面,Unicode 的功用是每一字元提供一唯一的代(即一字),而不是一字形。句,Unicode是字元以一抽象的方式呈,而上的演工 作(例如字大小、外形、字形、文等)留其他件理,例如器或是文字理器。
差不多所有系都支援基本拉丁字母,并各自支持不同的其他编码方式。Unicode为了和它们相互兼容,其首256字元保留ISO 8859-1所定的字元,使既有的西系文字的不需特考量;并且把大量相同的字元重到不同的字元中去,使得有的方式得以和 Unicode互相直接,而不失任何。
Unicode编码系统可分为编码方式和实现方式两个层次。
Unicode的编码方式与ISO 10646的通用字符集(Universal Character Set,UCS)概念相对应,目前实际应用的Unicode版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216即65536个字符。
实现方式
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)
UTF-8(8-bit Unicode Transformation Format)是一Unicode的[color=red]可度字元,也是一种前缀码[/color]。它可以用表示Unicode中的任何字元,且其中的第一位元仍ASCII相容,使得原理ASCII字元的或只做少部份修改,即可使用。因此,它逐成子件、及其他存或送文字的用中,先用的。它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。
UTF-8使用一至四位元每字符:
1.128US-ASCII字符只需一位元(Unicode由U+0000至U+007F)。2.有附加符号的拉丁文、希文、西里字母、美尼、希伯文、阿拉伯文、利文及它拿字母需要二位元(Unicode由U+0080至U+07FF)。3.其他基本多文平面(BMP)中的字元(包含了大部分常用字)使用三位元。4.其他少使用的Unicode 助平面的字元使用四位元。
UTF-8编码字节含义
?对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;?如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码;?如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;?如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;?如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;
因此,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符;根据前二位,可判断该字节是否为一个字符编码的第一个字节; 根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;根据前五位(如果前四位为1),可判断编码 是否有错误或数据传输过程中是否有错误。
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。
try { // 汉字中以UTF-8编码为 %E4%B8%AD(3字节) System.out.println(URLEncoder.encode("中", "UTF-8")); // 汉字中以UTF-8编码为 %3F (1字节 这是由于汉字在ISO-8859-1字符集中不存在,返回的是?在ISO-8859-1下的编码) System.out.println(URLEncoder.encode("中", "ISO-8859-1")); // 汉字中以UTF-8编码为 %D6%D0 (2字节) System.out.println(URLEncoder.encode("中", "GB2312")); // 把汉字中对应的UTF-8编码 %E4%B8%AD 用UTF-8解码得到正常的汉字 中 System.out.println(URLDecoder.decode("%E4%B8%AD", "UTF-8")); // 把汉字中对应的ISO-8859-1编码 %3F 用ISO-8859-1解码得到? System.out.println(URLDecoder.decode("%3F", "ISO-8859-1")); // 把汉字中对应的GB2312编码 %D6%D0 用GB2312解码得到正常的汉字 中 System.out.println(URLDecoder.decode("%D6%D0", "GB2312")); // 把汉字中对应的UTF-8编码 %E4%B8%AD 用ISO-8859-1解码 // 得到字符??-(这个就是所谓的乱码,其实是3字节%E4%B8%AD中每个字节对应的ISO-8859-1中的字符) // ISO-8859-1字符集使用了单字节内的所有空间 System.out.println(URLDecoder.decode("%E4%B8%AD", "ISO-8859-1")); // 把汉字中对应的UTF-8编码 %E4%B8%AD 用GB2312解码 // 得到字符涓?,因为前2字节 %E4%B8对应的GB2312的字符就是涓,而第3字节%AD在GB2312编码中不存在,故返回? System.out.println(URLDecoder.decode("%E4%B8%AD", "GB2312")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }