第19章_编码方式
1、什么是ASCII和Unicode
1.1 字符编码和ASCII
1.1.1 字符编码
字符编码(Character Encoding)是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。
1.1.2 ASCII
ASCII( American Standard Code for InformationInterchange, 美国信息交换标准代码) 是基于拉丁字母的⼀套电脑编码系统, 主要⽤于显⽰现代英语和其他西欧语⾔。其中共有128个字符。
标准ASCII 码也叫基础ASCII码, 使⽤7 位⼆进制数( 剩下的1位⼆进制为0) 来表⽰所有的⼤写和⼩写字母, 数字0 到9、 标点符号, 以及在美式英语中使⽤的特殊控制字符。
- 0~31及127(共33个)是控制字符或通信专⽤字符( 其余为可显⽰字符) , 如控制符: LF( 换⾏) 、 CR( 回车) 、 FF( 换页) 、 DEL( 删除) 、 BS( 退格)、 BEL( 响铃) 等; 通信专⽤字符: SOH( ⽂头) 、 EOT( ⽂尾) 、 ACK( 确认) 等;
- ASCII值为8、 9、 10 和13 分别转换为退格、 制表、 换⾏和回车字符。 它们并没有特定的图形显⽰, 但会依不同的应⽤程序,⽽对⽂本显⽰有不同的影响
- 32~126(共95个)是字符(32是空格) , 其中48~57为0到9⼗个阿拉伯数字。
- 65~90为26个⼤写英⽂字母, 97~122号为26个⼩写英⽂字母, 其余为⼀些标点符号、 运算符号等。
1.2 Unicode
Unicode(中文:万国码、国际码、统一码、单一码)是一套通用的字符集。它对世界上大部分的文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。Unicode可以表示中文。
2、有了Unicode为啥还需要UTF-8
unicode虽然统一了全世界字符的二进制编码,但没有规定如何存储。
Unicode 是字符集。UTF-8 是编码规则。
常见的UFT格式有UTF-7、UTF-7.5、UTF-8、UTF-16、UTF-32
- UTF-8使用1~4个字节为每个字符编码
- UTF-16使用2或4字节为每个字符编码、
- UTF-32使用4字节为每个字符编码
所以说, UTF-8、UTF-16等都是Unicode的一种实现方式。
UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。
3、有了UTF8为什么还需要GBK?
其实UTF8确实已经是国际通用的字符编码了,但是这种字符标准毕竟是外国定的,而国内也有类似的标准指定组织,也需要制定一套国内通用的标准,于是GBK就诞生了。
常用的中文编码有GBK、GB2312、GB18030等,最常用的是GBK。
4、为什么会存在乱码
讲中文字符通过GBK编码,再使用UTF-8解码,得到的字符就是一串问号,这就是乱码了。
示例代码:
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "我爱中国!";
byte[] bytes = s.getBytes(Charset.forName("GBK"));
System.out.println("GBK编码,GBK解码:" + new String(bytes, "GBK"));
System.out.println("GBK编码,GB18030解码:" + new String(bytes, "GB18030"));
System.out.println("GBK编码,UTF-8解码:" + new String(bytes, "UTF-8"));
}
输出结果如下:
GBK编码,GBK解码:我爱中国!
GBK编码,GB18030解码:我爱中国!
GBK编码,UTF-8解码:�Ұ��й���