黑马程序员之编码解码的问题

------- android培训java培训、期待与您交流! ----------

总结:

/**
* 编码:字符串编程字节数组
* 解码:字节数组变成字符串
* String-->byte[] : str.getBytes(charsetName);
*
* byte[]-->String : new String(byte[],charsetName);
*
* 编码用GBK,解码用UTF-8会出现两个问号
* 编码用UTF-8,解码用GBK会出现“浣犲ソ”
*
*/

package fighting;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;

public class EncodeDemo {
 public static void main(String[] args) throws IOException {
  String s ="你好";
  //利用字符串类的getBytes方法编码,把字符串转化为字节数组
  byte[] b1 = s.getBytes("gbk");
  System.out.println(Arrays.toString(b1));
  //利用String类的构造方法解码,把字节数组转化为字符串
  String s1 = new String(b1,"iso8859-1");
  System.out.println(s1);
  
  /**
   * 由于s用gbk编码,s1用iso8859-1进行解码,所以会出现四个问号"????"
   * 这种情况,可以把s1再用iso8859-1进行编码,然后用gbk进行解码,
   * 这样就可以正常显示s的字符了
   * 注意:如果s1使用utf-8进行解码,再使用上面这个"重新编一次解一次"的方法会出错。
   *       因为gbk和utf-8都识别中文,gbk一个汉字占2个字节,utf-8一个汉字占2或3个字节
   */
  //对s1进行iso8859-1编码
  byte[] b2= s1.getBytes("iso8859-1");
  //对b2进行解码
  String s2 = new String(b2,"gbk");
  System.out.println(s2);
//  writeText();
//  readText();
 }

}

输出结果为:

[-60, -29, -70, -61]
????
你好

上面这个例子的解码方式,在用到Tomcat服务器的项目中经常用到,为什么呢?因为Tomcat使用的是iso8859-1的编码方式,而我们平常用的是gbk编码方式。这样编码不统一,所以经常出现乱码问题。

下面解释一下标黄色部分的意思:同样的代码copy过来,只把标红的部分改成utf-8

 String s ="你好";
//利用字符串类的getBytes方法编码,把字符串转化为字节数组
byte[] b1 = s.getBytes("gbk");
System.out.println(Arrays.toString(b1));
//利用String类的构造方法解码,把字节数组转化为字符串
String s1 = new String(b1,"utf-8");
System.out.println(s1);

//对s1进行iso8859-1编码
byte[] b2= s1.getBytes("utf-8");
//对b2进行解码
String s2 = new String(b2,"gbk");
System.out.println(s2);
// writeText();
// readText();
}

}

输出结果:

[-60, -29, -70, -61]
???
锟斤拷锟?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值