字符集、编码解码

文章讲述了ASCII字符集如何适应早期计算机,然后介绍了GBK字符集在中国的应用,以及Unicode和其变种UTF-8、UTF-16、UTF-32在处理不同语言字符上的优势。还涉及了Java中Charset类的使用,展示了字符编码和解码的过程。
摘要由CSDN通过智能技术生成

字符集

计算机是美国人发明的,由于计算机能够处理的数据只能是0和1组成的二进制数据,为了让计算机能够处理字 符,于是美国人就把他们会用到的每一个字符进行了编码(所谓编码,就是为一个字符编一个二进制数据
美国人常用的字符有英文字母、标点符号、数字以及一些特殊字符,这些字符一共也不到128个,所以他们用1个 字节来存储1字符就够了。美国人把他们用到的字符和字符对应的编码总结成了一张码表,这张码表叫做ASCII码表(也叫ASCII字符集)。
其实计算机只在美国用是没有问题的,但是计算机慢慢的普及到全世界,当普及到中国的时候,在计算机中想要 存储中文,那ASCII字符集就不够用了,因为中文太多了,随便数一数也有几万个字符。于是中国人为了在计算机中存储中文,也编了一个中国人用的字符集叫做 GBK 字符集,这里面包含2万多个汉字 字符,为了能够显示英文字母, GBK 字符集也兼容了ASCII字符集,   GBK 字符集中一个字母还是采用一个字节 来存储
汉字和字母的编码特点:
如果是存储字母,采用1个字节来存储,一共8位,第一位是0
如果是存储汉字,采用2个字节来存储,一个是16位,第一位是1

 当读取文件中的字符时,通过识别读取到的第1位是0还是1来判断是字母还是汉字

如果读取到第1位是0,就认为是⼀个字⺟,此时往后读1个字节。
如果读取到第1位是1,就认为是⼀个汉字,此时往后读2个字节。

 GBK:

GBK一个字母占1个字节,一个汉字占2个字节;表示中国人使用的汉字

Unicode:

因为各个国家互不兼容,所以有了通用的一套字符集:Unicode字符集,它一个字符采用4个字节存储;一个字母、数字占1个字节,一个汉字占3个字节

UTF及特点:

但对于说英语的国家只需要26个大小写字母和标点,本身一个字节就可以表示,用4个字节就比较浪费,所以又对Unicode字符集中的字符进行了重新编码,设计了三种编码方案,分别是UTF-32 , UTF-16 , UTF-8,其中比较常用的是UTF-8

UTF-8是一种可变长的编码方案,英文字母和数字占1个字节,汉字占3个字节,极少数字符占4个

UTF-16是一种固定长度编码,通常情况一个汉字占2个字节,一些特殊汉字(编码超过了0xFFFF)会占4个字节(2个16位代码单元)

UTF-32是一种固定长度编码,每个字符都占用4个字节(32位)


编码和解码:

编码:把字符串按照指定的字符集转为字节数组

/*编码*/
String date="a我b";
byte[] bytes=date.getBytes();
System.out.println(Arrays.toString(bytes));//[97, -26, -120, -111, 98]
/*按指定字符集进行编码*/
byte[] bytes1=date.getBytes("GBK");
System.out.println(Arrays.toString(bytes1));//[97, -50, -46, 98]

解码:把字节数组按照指定的字符集转换为字符串

/*解码*/
String s1=new String(bytes);
System.out.println(s1);  //a我b
String s2=new String(bytes1,"GBK");
System.out.println(s2);  //a我b

CharSet:

在Java中, Charset 是一个表示字符集的类,它位于 java.nio.charset 包中。 Charset 类提供了用于处理字符编码的工具和方法,是一个抽象类。它用于表示字符编码的规范,可以用于字符编码和解码操作。

首先通过forName()来设置编码和解码字符集,类中提供 encode 与 decode 分别对应 char[] 到 byte[] 的编码和 byte[] 到 char[] 的解码,用法如下:

Charset charset = Charset.forName("UTF-8");   
ByteBuffer byteBuffer = charset.encode(string);   
CharBuffer charBuffer = charset.decode(byteBuffer);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值