文章目录

  • 前言
  • 常见的编码:
  • UTF-8
  • Unicode
  • 中文编码
  • 十六进制转中文


前言


学习到String时,学到String(byte[] bytes)这个构造器时,发现一直时乱码,总以为我输入{1,2,3},输出的String也应该是{1,2,3},怎么回事,以为是我的平台默认编码跟教程不一样,去查看了下自己平台的编码,教程里说平台默认是“UTF-8",也没错,额额

发现byte字符编码成中文:“这是中文”,这部分很疑惑,看了一些博客,有很多也是按教程那样写,哭了,因此继续深入了


常见的编码:

工作后经常接触的编码方式有如下几种:

  • ISO-8859-1 ASCII 数字和西欧字母
  • GBK GB2312 BIG5 中文
  • UNICODE (统一码,万国码)

其中

  • ISO-8859-1 包含 ASCII
  • GB2312 是简体中文,BIG5是繁体中文,GBK同时包含简体和繁体以及日文。
  • UNICODE 包括了所有的文字,无论中文,英文,藏文,法文,世界所有的文字都包含其中
- [ ] UNICODE因为要存放所有的数据,每个数字都是很长的(4个字节),因为不仅要表示字母,还要表示汉字等。

- [ ] 如果完全按照UNICODE的方式来存储数据,就会有很大的浪费。

- [ ] 比如在ISO-8859-1中,a 字符对应的数字是0x61
- [ ] 而UNICODE中对应的数字是 0x00000061,倘若一篇文章大部分都是英文字母,那么按照UNICODE的方式进行数据保存就会消耗很多空间。

UTF-8

- 在这种情况下,就出现了UNICODE的各种减肥子编码, 
- 比如UTF-8对数字和字母就使用一个字节,
- 而对汉字就使用3个字节,从而达到了减肥还能保证健康的效果

- UTF-8,UTF-16和UTF-32 针对不同类型的数据有不同的减肥效果,
- 一般说来UTF-8是比较常用的方式

Unicode

  • 写在.java源代码中的汉字,在执行之后,都会变成JVM中的字符。
  • 而这些中文字符采用的编码方式,都是使用UNICODE.
  • "中"字对应的UNICODE是4E2D,所以在内存中,实际保存的数据就是十六进制的0x4E2D, 也就是十进制的20013。

ANSI 这个不是ASCII的意思,而是采用本地编码的意思,如果你是中文的操作系统,就会使GBK,如果是英文的就会是ISO-8859-1

中文编码

String st = "您好";
		//utf-8,gbk,utf-16……
		byte[] b1=st.getBytes(Charset.forName("UTF-8"));
		
		System.out.println(b1);
		
		for(byte b0:b1){
			System.out.print(b0);
			System.out.print("   ");
		}
		System.out.println();
		//解码跟编码要对应
		System.out.println(new String(b1,Charset.forName("UTF-8")));
[B@6d06d69c
-26   -126   -88   -27   -91   -67
您好

十六进制转中文

//寻找0XE5,0XB1,0X8C对应的汉字
		int[] b2={0XE5,0XB1,0X8C};
		for(int bb2:b2){
			System.out.print(bb2);
			System.out.print("   ");
		}
		System.out.println();
		byte[] b3= new byte[b2.length];
		for(int i=0;i<b2.length;i++){
			b3[i]=(byte)b2[i];
			System.out.print(b3[i]);
			System.out.print("   ");
		}
		System.out.println();
		
		System.out.println(new String(b3,Charset.forName("UTF-8")));
229   177   140
-27   -79   -116
屌