java的IO流之字符编码
2017-06-26 20:26
309 查看
1.字符编码的发展历程
阶段1:计算机只认识数字,我们在计算机里一切数据都是以数字来表示,因为英文符号有限,
所以规定使用的字节的最高位是0.每一个字节都是以0~127之间的数字来表示,比如A对应65,a对应97.
这就是美国标准信息交换码-ASCII.
阶段2:
随着计算机在全球的普及,很多国家和地区都把自己的字符引入了计算机,比如汉字.
此时发现一个字节能表示数字范围太小,不能包含所有的中文汉字,那么就规定使用两个字节来表示一个汉字.
规定:原有的ASCII字符的编码保持不变,仍然使用一个字节表示,为了区别一个中文字符与两个ASCII码字符,
中文字符的每个字节最高位规定为1(中文的二进制是负数).这个规范就是GB2312编码,
后来在GB2312的基础上增加了更多的中文字符,比如汉字,也就出现了GBK.
阶段3:
新的问题,在中国是认识汉字的,但是如果把汉字传递给其他国家,该国家的码表中没有收录汉字,其实就显示另一个符号或者乱码.
为了解决各个国家因为本地化字符编码带来的影响,咱们就把全世界所有的符号统一进行编码-Unicode编码.
此时某一个字符在全世界任何地方都是固定的,比如'哥',在任何地方都是以十六进制的54E5来表示.
Unicode的编码字符都占有2个字节大小.
--------------------------------------------------------------------------------------------------------------
常见的字符集:
ASCII: 占一个字节,只能包含128个符号. 不能表示汉字
ISO-8859-1:(latin-1):占一个字节,收录西欧语言,.不能表示汉字.
ANSI:占两个字节,在简体中文的操作系统中 ANSI 就指的是 GB2312.
GB2312/GBK/GB18030:占两个字节,支持中文.
UTF-8:是一种针对Unicode的可变长度字符编码,又称万国码,是Unicode的实现方式之一。
编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。
因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。
UTF-8 BOM:是MS搞出来的编码,默认占3个字节,不要使用这个.
--------------------------------------------------------------------------------------------------------------
存储字母,数字和汉字:
存储字母和数字无论是什么字符集都占1个字节.
存储汉字: GBK家族占两个字节,UTF-8家族占3个字节.
--------------------------------------------------------------------------------------------------------------
不能使用单字节的字符集(ASCII/ISO-8859-1)来存储中文.
2.字符的编码和解码操作
编码: 把字符串转换为byte数组.解码: 把byte数组转换为字符串.
一定要保证编码和解码的字符相同,否则乱码.
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class IODemo3 {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "杨哥";
//编码String---->byte[]
byte[] bytes = str.getBytes();//我这里默认是UTF-8
System.out.println(Arrays.toString(bytes));//[-26, -99, -88, -27, -109, -91]
//解码byte[]--->String
String ret = new String(bytes);////我这里默认是UTF-8
System.out.println(ret);//杨哥
System.out.println("================================");
String str2 = "杨哥哥";
//编码String---->byte[]
byte[] bytes2 = str.getBytes("GBK");//我也可以自己指定编码
System.out.println(Arrays.toString(bytes2));//[-47, -18, -72, -25]
//解码byte[]--->String
String ret2 = new String(bytes2);//我这里默认是UTF-8,
System.out.println(ret2);//这里出现乱码���,因为我前面指定了编码为GBK
//所以解码也应该用GBK
String ret3 =new String(bytes2, "GBK");
System.out.println(ret3);//杨哥
}
}
相关文章推荐
- Java基础-21总结字符流,IO流编码问题,实用案例
- JAVA File类、IO流体验与简介(字节流、字符流、序列流、打印流、编码、递归)
- Lesson_for_java_day16--java中的异常和IO流(File类、字节流、字符流、指定编码格式)
- Java基础-21总结字符流,IO流编码问题,实用案例必做一遍
- java中IO流字符流中的编码
- Java字符编码转换过程说明
- 在Java中正确解码用Javascript:escape()编码的中文字符
- 转载一片关于java字符编码的文章
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换[引]
- JAVA字符的编码[转载]
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- JAVA字符编码系列三:Java应用中的编码问题
- WEB开发中的JAVA字符编码经验总结
- JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- Java字符编码 --摘自http://blog.csdn.net/numenZQ/archive/2007/06/17/1654827.aspx
- Java字符编码转换过程说明[转]
- java字符编码原理解析
- 用java程序将GBK字符转成UTF-8编码格式
- JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
- JAVA字符编码系列三:Java应用中的编码问题