黑马程序员-转换流的字符编码

 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

 

 

字符流的出现为了方便操作字符

更重要的是加入了编码转换

通过子类转换流来完成
InputStreamReader
OutputStreamWriter

在两个对象进行构造的时候可以加入字符集

(还有两个能加入编码表 printStream和printWriter 但只能打印,不能读取)

 

编码表的由来:
    计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表,这就是编码表。

 

常见的编码表
ASCII:美国标准信息交换码,用一个字节的7位可以表示。
ISO8859-1:拉丁码表,欧洲码表,用一个字节的8位表示。
GB2312:中国的中文编码表
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。让所有文字都用两个字节表示,Java语言使用的就是Unicode。
UTF-8:最多用三个字节来表示一个字符。

 

/*
编码:字符串变成字节数组。


解码:字节数组变成字符串。

String-->byte[];  str.getBytes(charsetName);


byte[] -->String: new String(byte[],charsetName);

*/


import java.util.*;
class  EncodeDemo
{
 public static void main(String[] args)throws Exception
 {
  String s = "哈哈";

  byte[] b1 = s.getBytes("GBK");

  System.out.println(Arrays.toString(b1));
  String s1 = new String(b1,"utf-8");
  System.out.println("s1="+s1);

  //对s1进行iso8859-1编码。
  byte[] b2 = s1.getBytes("utf-8");
  System.out.println(Arrays.toString(b2));

  String s2 = new String(b2,"gbk");

  System.out.println("s2="+s2);

  

 }
}

 


出现乱码,可以将“你好”放进去,若出的是??,则
用GBK编码,用UTF-8解码;
若出现的是“浣cai”,则用UTF-8编码,GBK解码。

 


字符编码

编码:字符串变成字节数组

解码:字节数组变成字符串

String-->byte[]; str.getBytes(charsetName);

byte[]-->String; new String(byte[],charsetName);

 


/*
编码:字符串变成字节数组。


解码:字节数组变成字符串。

String-->byte[];  str.getBytes(charsetName);


byte[] -->String: new String(byte[],charsetName);

*/


import java.util.*;
class  EncodeDemo
{
 public static void main(String[] args)throws Exception
 {
  String s = "哈哈";

  byte[] b1 = s.getBytes("GBK");

  System.out.println(Arrays.toString(b1));
  String s1 = new String(b1,"utf-8");
  System.out.println("s1="+s1);

  //对s1进行iso8859-1编码。
  byte[] b2 = s1.getBytes("utf-8");
  System.out.println(Arrays.toString(b2));

  String s2 = new String(b2,"gbk");

  System.out.println("s2="+s2);

  

 }
}

 

若解码用错了码表,可以将解码出现的字符,转换成字节,再用其他码表解码。(例如iso8859-1和GBK之间,但utf-8和GBK则不行,因为他们都识别中文)

客户端提交的字符,若是get提交,编码错误则只能重新编码再解码;
若为post提交的话,则可以直接设置字符编码来解决。

 


字符编码-联通


class EncodeDemo2
{
 public static void main(String[] args) throws Exception
 {
  String s = "?";

  byte[] by = s.getBytes("gbk");

  for(byte b : by)
  {
   System.out.println(Integer.toBinaryString(b&255));
  }


  System.out.println("Hello World!");
 }
}

 


utf-8自定的头,用来区别一次读取几个字节
若为一个字节,则头位为0;
若两个,则第一个字节头位为110,第二个字节头位为10;
若三个字节,则头位依次为:
1110
10
10

 

加入编码表后,别忘了抛出异常

只取后八位,则x&255

“联通”二字,用GBK编码,符合UTF-8的编码格式,记事本会自动按照UTF-8解码。

 


 

----------- android培训java培训java学习型技术博客、期待与您交流! ------------ 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值