一、字符串的编码和解码java
如下是对字符串进行编码:编码
//Convert from String to byte[]: String s = "中国"; byte[] b = s.getBytes("UTF-8"); for(byte i:b){ System.out.print(i+","); }
输出:code
-28,-72,-83,-27,-101,-67,
如何解码:(解码时首先要明白是采用什么方式编码的) 如上咱们知道采用UTF-8格式进行编码的,那么就采用UTF-8格式进行解码:utf-8
//Convert from byte[] to String: byte[] t = {-28,-72,-83,-27,-101,-67}; String tt = new String(t,"UTF-8"); System.out.println(tt);
输出:字符串
中国
假如咱们解码的时候采用GBK进行解码,就会出现乱码:get
//Convert from byte[] to String: byte[] t = {-28,-72,-83,-27,-101,-67}; String tt = new String(t,"GBK"); System.out.println(tt);
以上采用GBK方式进行解码,出现乱码,输出为:string
涓浗
注意事项it
1.控制台的输出也会有对应的编码格式,这个编码格式是支持输出的字符串的显示的编码。好比UTF-8表明中文的输出也能够打印,若是改成:ISO-8859-1,中文就没法显示了,由于,ISO-8859-1没法对中文进行编码。 2.因此控制台尽可能采用UTF-8格式,这样几乎全部的输出都可以看到。io
理论上经过经过编码格式A编码,再经过编码格式A解码,就不会出现乱码。注意:前提是编码格式A必必须可以进行编码和解码。若是A不可以进行编码,即便经过A进行解码也会出现乱码。字符编码
举个例子: 你是一个厨师,只会对蔬菜、水果、肉类这三种物品进行作菜。
这时候给你:苹果、橘子、白菜、萝卜、猪肉、羊肉你均可以进行分类,再给你一个 屠龙刀,你傻了。这屠龙刀是哪个分类?如何作菜?
这时候你的分类为: 、
蔬菜:白菜、萝卜 肉类:猪肉、羊肉 水果类:橘子、苹果
??? :屠龙刀
屠龙刀你不知道怎么办,就打了三个大大的问号 ??? 因此就会出现乱码了:
下面我举个例子:灰常形象:
//Convert from String to byte[]: String s = "中国"; byte[] b = s.getBytes("big5"); for(byte i:b){ System.out.print(i+","); } System.out.println(); //Convert from byte[] to String: String tt = new String(b,"big5"); System.out.println(tt);
输出:
-92,-92,63, 中?
分析输出结果 用big5编码再用big5解码为何会输出 “中?”呢
就是由于 "国" 在big5编码格式中不能顺利编码,就是big5编码格式中不能对 “国” 字进行编码,因此乱码了。
若是改成GBK或者UTF-8就能够了,由于GBK或者UTF-8可以顺利对 “国” 字进行编码和解码 以下:
//Convert from String to byte[]: String s = "中国"; byte[] b = s.getBytes("GBK"); for(byte i:b){ System.out.print(i+","); } System.out.println(); //Convert from byte[] to String: String tt = new String(b,"GBK"); System.out.println(tt);
输出结果:
-42,-48,-71,-6, 中国
总结: 不出现乱码的几个条件 一、编码格式可以兼容对应的 被编码者 二、在第一条的基础上,用A编码格式编码就要用A编码格式进行解码。 三、输出的结果和对应的平台也要支持对应的编码格式
两种编码格式都可以兼容的,采用A编码格式编码,再用B编码格式解码也能够正常显示,由于A、B都兼容,若是常规的ASCII编码, LFFFFF1112中111111
这种方式严重不建议,没啥意义
//Convert from String to byte[]: String s = "LFFFFF1112中111111"; byte[] b = s.getBytes("gb2312"); for(byte i:b){ System.out.print(i+","); } System.out.println(); //Convert from byte[] to String: String tt = new String(b,"UTF-8"); System.out.println(tt);
输出:除了中文部分,都可以正常显示,由于中文部分gb2312和UTF-8不是采用同一种编码格式
76,70,70,70,70,70,49,49,49,50,-42,-48,49,49,49,49,49,49, LFFFFF1112��111111
说明几点 一、工做空间的编码格式,只是表明你编写程序的时候能够输入的编码,好比UTF-8就表明 String a = "你好" 可以正常显示,若是你把工做空间编码格式修改成:ISO-8859-1,你们都知道ISO-8859-1不支持中文,这样就会显示乱码: String a = "ä½ å¥½" ;但最好设置为UTF-8由于可以输入任何形式的内容。
二、控制台输出的编码格式也能够调,但最好设置为UTF-8格式,由于你可以输出任何形式的内容
引用文章: