本文主要是介绍Java——IO流(一)-(4/8):前置知识-字符集、UTF-8、GBK、ASCII、乱码问题、编码和解码等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
常见字符集介绍
标准ASCII字符集
GBK(汉字内码扩展规范,国标)
Unicode字符集(统一码,万国码)
小结
字符集的编码、解码操作
方法
实例演示
常见字符集介绍
标准ASCII字符集
- ASCll(American Standard Code for Information Interchange):美国信息交换标准代码,包括了英文、符号等。
- 标准ASCII使用1个字节存储一个字符,首尾是0,总共可表示128个字符。
包含了:英文字母(大小写)、数字、标点符号、特殊字符。
使用一个字节来存储。
这个字符集在美国在足够使用了,但是计算机不仅仅只在一个国家流通,我们国家的汉字就比字符多出很多很多,一个字节是完全不够表示完全的,于是就出现了GBK。
GBK(汉字内码扩展规范,国标)
- 汉字编码字符集,包含了2万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储。
- 注意:GBK兼容了ASCII字符集。
假设要编码:我a你
为了解码,GBK规定:汉字的第一个字节第一位必须是1.
看完了中文的字符集,接下来要再讲其他语言的字符集吗?
例如:巴基斯坦码、迪拜码、岛国码、韩文码、乌兹别克斯坦码、吉尔吉斯斯坦码、哈萨克斯坦码等等。
显然是不太可能的,于是国际组织就制定了统一的一个字符集。
Unicode字符集(统一码,万国码)
- Unicode是国际组织制定的,可以容纳世界上所有文字、符号的字符集。
其中,Unicode字符集里面的UTF-32编码方案就是使用四个字节表示一个字符,直接兼容几乎所有语言的字符;但是这种方式是十分奢侈的,很占存储空间,导致通信效率变低!
而UTF-8的出现让效率得到了大提升
UTF-8
- 是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节
- 英文字符、数字等只占1个字节(兼容标准ASCII编码),汉字字符占用3个字节。
UTF-8编码方式(二进制) |
---|
0xxxxxxx(ASCII码) |
110xxxxx 10xxxxxx |
1110xxxx 10xxxxxx 10xxxxxx |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
注意:技术人员在开发时都应该使用UTF-8编码!
小结
- ASCII字符集:只有英文、数字、符号等,占1个字节。
- GBK字符集:汉字占2个字节,英文、数字占1个字节。
- UTF-8字符集:汉字占3个字节,英文、数字占1个字节。
注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码
注意2:英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码。
字符集的编码、解码操作
- 编码:把字符按照制定字符集编码成字节。
- 解码:把字节按照制定字符集解码成字符。
方法
Java代码完成对字符的编码
String提供了如下方法 | 说明 |
---|---|
byte[] getBytes() | 使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) | 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
Java代码完成对字符的解码
String提供了如下方法 | 说明 |
---|---|
String(byte[] bytes) | 通过使用平台的默认字符集解码指定的字节数组来构造新的String |
String(byte[] bytes, String charsetName) | 通过指定的字符集解码指定的字节数组来构造新的String |
实例演示
public class CodeTest1 {public static void main(String[] args) throws Exception {//1.编码String data = "a我b";byte[] bytes = data.getBytes(); //默认是按照平台字符集(UTF-8)进行编码的。System.out.println(Arrays.toString(bytes));//按照制定字符集进行编码byte[] bytes1 = data.getBytes("GBK");System.out.println(Arrays.toString(bytes1));//2.解码String s1 = new String(bytes); //按照平台默认编码(UTF-8)解码System.out.println(s1);String s2 = new String(bytes1);System.out.println(s2); //乱码}
}
运行结果:
解决乱码:
运行结果:
END
学习自:黑马程序员——Java课程
这篇关于Java——IO流(一)-(4/8):前置知识-字符集、UTF-8、GBK、ASCII、乱码问题、编码和解码等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!