(94)字符编码、联通问题

一、编码表概述
字符流的出现为了方便操作字符,更重要 的是加入了编码转换。
通过子类转换流来完成:InputStreamReader、OutputStreamWriter
在两个对象进行构造的时候加入字符流
编码表:将各个国家的文字用数字来表示,并一一对应。
这里写图片描述

二、转换流的字符编码
public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException创建使用指定字符集的 OutputStreamWriter
①写入(字符–>字节)

 OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("E:\\utf.txt"),"utf-8");//用UTF-8编码存入数据
        osw.write("你好");
        osw.close();

②读出(字节—>字符)
String(char[] value, int offset, int count) :将字符数组转换为字符串

        InputStreamReader isr=new InputStreamReader(new FileInputStream("E:\\utf.txt"),"utf-8");//以utf-8读出文件
        char [] buf=new char[1024];
        int len=0;
        while((len=isr.read(buf))!=-1) {
            String str=new String(buf,0,len);
            System.out.println(str);
        }

这里写图片描述
下面对写入和读出解释:
写入:写入“你好”,按照utf-8查表,将对应的二进制存入utf.txt。
读出:将utf-8二进制按照utf-8编码表读出,“你好”

若按照其他编码方式读出,就不能读出原数据。原数据按照utf-8编码(在此编码情况下,一个汉字占3个字节),要按照gbk(一个汉字两个字节)读出,则查gbk编码,因为gbk是两个字节的查,所以很可能刚好-12 -45在gbk中有对应的汉字,则输出对应汉字【utf中6个字节在gbk中解析出三个汉字】
这里写图片描述

若源文件是gbk编码“你好”,读出是utf,则读出的是??
用utf读,则汉字以3个字节的读,-17 -55 -24寻找在utf中的编码,没有对应的,输出?

三、字符编码
编码:字符串变成字节数组
解码:字符数组变成字符串
String—->byte [] :
public byte[] getBytes():通过使用平台的默认字符集将此String编码为byte序列
public byte[] getBytes(Charset charset):通过通过给定的charset将此String编码为byte序列

byte[] —–>String :
public String(byte[] bytes):通过使用平台的默认字符集解码指定的byte数组。
public String(byte[] bytes, Charset charset):通过使用指定的charset解码指定的byte数组
①下面以用a编码用a解码进行演示

        String s="你好";
        //编码
        byte[] b1=s.getBytes();
        byte[] b2=s.getBytes("gbk");//指定编码
        System.out.println(Arrays.toString(b1));//将数组变成字符串
        System.out.println(Arrays.toString(b2));

        //解码
        String s1=new String(b1);
        System.out.println(s1);
        String s2=new String(b1,"gbk");
        System.out.println(s2);

输出:
[-60, -29, -70, -61]
[-60, -29, -70, -61]
你好
你好

②下面以用a编码用b解码进行演示

        String s="你好";
        //编码
        byte[] b1=s.getBytes("utf-8");

        System.out.println(Arrays.toString(b1));



        //解码
        String s1=new String(b1,"gbk");

        System.out.println(s1);
输出:
[-28, -67, -96, -27, -91, -67]
浣犲ソ

③编码正确,但解码错误,该怎么办?

       String s="你好";
        //编码
        byte[] b1=s.getBytes("gbk");

        System.out.println(Arrays.toString(b1));//[-60, -29, -70, -61]

        //解码
        String s1=new String(b1,"iso8859-1");
        System.out.println(s1);//????

        //编码
        byte[] b2=s1.getBytes("iso8859-1");
        System.out.println(Arrays.toString(b2));//[-60, -29, -70, -61]

        //解码
        String s2=new String(b2,"gbk");
        System.out.println(s2);//你好

这里写图片描述

在开发中的应用
这里写图片描述
假定浏览器字符编码gbk,浏览器输入“你好”,点击搜索,将编码[-60, -29, -70, -61]传输到服务器端, 服务器端的编码是ISO编码,所以解码出现的是????,那么服务器端的开发就得通过对原数据ISO编码再解码的形式,得到客户端的数据,进行相应的操作,再将操作的gbk编码返回客户端,再由客户端解码为字符串。

四、“联通“问题
在文本文档中写入“联通”,再次打开该文本,是乱码:解码出现问题

public static void main(String[] args) throws UnsupportedEncodingException {
        String s="联通";
        byte[] by=s.getBytes("gbk");

        for(byte b:by) {
            System.out.println(Integer.toBinaryString(b&255));//前三个字节全是1,只想看第4个字节(有效位)的二进制
        }
    }
输出编码:
11000001
10101010
11001101
10101000

这个编码符合UTF-8的编码规则,110读两个字节,所以按照utf-8解码,读出的是乱码

posted @ 2017-07-26 14:04  测试开发分享站  阅读(96)  评论(0编辑  收藏  举报