字符集编码的简单概述

字符编码的发展历程:

阶段1:

       计算机只认识数字,我们在计算机里一切数据都是以数字来表示,因为英文符号有限,所以规定使用字节的最高位都是0,每一个直接都是以0~127之间的数字来表示,比如A对应65,a对应97.这就是美国标准信息交换码-ASCLL

阶段2:
       随着计算机在全球的普及,很多国家和地区都把自己的字符引入了计算机,比如汉字。
此时发现一个字节能表示数字范围太小,不能包含所有的中文汉字,那么就规定使用两个字节来表示一个汉字。
       规定:原有的ASCLL字符的编码保持不变,仍然使用一个字节表示,为了区别一个中文字符与两个ASCLL码字符,中文字符的每一个直接最高位规定为1(中文的二进制是负数),这个规定就是GB2312编码。
后来在GB2312的基础上增加了更多的中文字符,比如汉字,也就出现了GBK。


阶段3:
       新的问题,在中国是认识汉字的,但是如果把汉字传递给其他国家,该国家的码表中没有收录汉字,其实就显示另一个符号或乱码。为了解决各个国家因为本地化字符编码带来的影响,咱们就把全世界所有的符号统一进行编码-Unicode编码。Unicode的编码字符都占有2个字节大小。


常见的字符集:
ASCLL:占一个字节,只能包含128个字符,不能表示汉字。
ISO-8859-I(latin-1):占一个字节,收录西欧语言,不能表示汉字。
ANSI:占用两个字节,在简体中文的操作系统中ANSI就指的是GB2312。
GB2312/GBK/GB2312/GBK/G18030:占两个字节,支持中文。
UTF-8:是一种针对Unicde的可变长度字符编码,又称万国码,是Unicode的实现方式之一。编码中的第一个字节仍与ASCLL兼容,这使得原来处理ASCLL字符的软件无须或只须做少部分修改,即可继续使用。因此,它主键成为电子邮件、网页及其他存储或传达文字的应用中,有限采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。


注意:UTF-8+BOM:是微软搞出来的编码,默认占3个字节,不要使用这个,很容易出现乱码。

存储字母、数字和汉字:
存储字母和数字无论是什么字符集都占1个字节。
存储汉字:GBK家族占两个字节,UTF-8家族占3个字节。

字符的编码和解码操作:
编码:
把字符串转换为byte数组
解码:把byte数组转换为字符串
一定要保证编码和解码的字符相同,否则乱码。

下面一段代码演示一下转换:

public class EncodingDemo {

	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "军籽";
		//编码操作:String->byte[]
		byte[] data = str.getBytes("GBK");
		System.out.println(Arrays.toString(data));//[-66, -4, -41, -47]
		
		//解码操作:byte[]->String
		String ret = new String(data,"GBK");
		System.out.println(ret);//军籽
		
		//----------------------------------------------
		
		//解决乱码
		byte[] data1 = str.getBytes("GBK");
		System.out.println(Arrays.toString(data1));//[-66, -4, -41, -47]
		
		//解码操作:byte[]->String
		String ret1 = new String(data1,"ISO-8859-1");
		System.out.println(ret1);
		//对于中文来说,乱码:?ü×?
		
		
		//解决方案:
		data1 = ret1.getBytes("ISO-8859-1");
		System.out.println(Arrays.toString(data1));//[-66, -4, -41, -47]
		ret1 = new String(data1,"GBK");
		System.out.println(ret1);//军籽
	}

}

运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值