Unicode万国码、UTF8、GB2312、GBK、ISO-8859-1

[color=green]Unicode(統一碼、萬國碼、單一碼、標準萬國碼)[/color]是電腦科學領域裡的一項業界標準,用以統一地呈現和處理世界上大部分的文字系統,並為其編碼。
Unicode依照通用字符集(Universal Character Set)的標準來發展,同時也以書本的形式對外發表。Unicode至今仍在不斷擴增,每個新版本都加入更多新的字符。目前最新的Unicode第六版,除了已納入超過十萬個字符(Unicode的第十萬個字符在2005年獲採納,且認可成為標準之一),還包含可用作視覺參考的代碼圖表、編碼方法、標準的字符編碼,以及記錄了如大小寫字母等字符特性的列表這些資料。
在文字處理方面,[color=red]Unicode 的功用是為每一個字元提供一個唯一的代碼(即一組數字),而不是一種字形。[/color]換句話說,Unicode是將字元以一種抽象的方式來呈現,而將視覺上的演繹工 作(例如字體大小、外觀形狀、字體形態、文體等)留給其他軟件來處理,例如網頁瀏覽器或是文字處理器。
差不多所有電腦系統都支援基本拉丁字母,并各自支持不同的其他编码方式。[color=red]Unicode为了和它们相互兼容,其首256字元保留給ISO 8859-1所定義的字元,使既有的西歐語系文字的轉換不需特別考量[/color];并且把大量相同的字元重複編到不同的字元碼中去,使得舊有紛雜的編碼方式得以和 Unicode編碼間互相直接轉換,而不會遺失任何資訊。

[color=red]Unicode编码系统可分为编码方式和实现方式两个层次。[/color]
Unicode的编码方式与ISO 10646的通用字符集(Universal Character Set,UCS)概念相对应,[color=red]目前实际应用的Unicode版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216即65536个字符。[/color]
实现方式
Unicode的实现方式不同于编码方式。[color=red]一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。[/color]Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)

UTF-8(8-bit Unicode Transformation Format)[color=green]是一種針對Unicode的[color=red][/color]可變長度字元編碼,也是一种前缀码[/color]。它可以用來表示Unicode標準中的任何字元,且其編碼中的第一個位元組仍與ASCII相容,這使得原來處理ASCII字元的軟體無須或只須做少部份修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。[color=red]它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。[/color]

UTF-8使用一至四個位元組為每個字符編碼:
[list]
[*]1.[color=red]128個US-ASCII字符只需一個位元組編碼(Unicode範圍由U+0000至U+007F)。[/color]
[*]2.帶有附加符号的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要二個位元組編碼(Unicode範圍由U+0080至U+07FF)。
[*]3.其他基本多文種平面(BMP)中的字元(這包含了大部分常用字)使用三個位元組編碼。
[*]4.其他極少使用的Unicode 輔助平面的字元使用四位元組編碼。
[/list]
UTF-8编码字节含义
[list]
[*]•对于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字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;
[/list]
因此,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符;根据前二位,可判断该字节是否为一个字符编码的第一个字节; 根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;根据前五位(如果前四位为1),可判断编码 是否有错误或数据传输过程中是否有错误。

[color=green]GBK[/color]是国家标准GB2312基础上扩容后兼容GB2312的标准。[color=red]GBK的文字编码是用双字节来表示的[/color],即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。[color=red]GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。[/color]

[color=green]GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:[/color]
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

[color=green]ISO-8859-1[/color]编码是[color=red]单字节编码,向下兼容ASCII[/color],其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。
  ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号出现的比较晚,没有被收录在ISO-8859-1当中。
  因为ISO-8859-1编码范围[color=red]使用了单字节内的所有空间[/color],在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。[color=red]换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。[/color]这是个很重要的特性,MySQL数据库默认编码是Latin1就是利用了这个特性。[color=red]ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。[/color]
  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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值