java笔记27 编码表与编码转换

来源:互联网 发布:河南省进出口数据 编辑:程序博客网 时间:2024/05/16 12:10

1.       编码表

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

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

        编码转换可以通过子类转换流来完成,可以加入字符集

1.2  编码表

        计算机智能识别二进制数据,早起由来是电信号

        为了便于计算机识别各个国家的文字,就将各国文字用数字表示,并一一对应,形成了编码表。       

        常见编码表

        ASCII:美国标准信息交换码

                 用一个字节的7位表示

        ISO8859-1:拉丁码表  欧洲码表

                 用一个字节的8位表示

        GB2312:中国的中文编码表

                 用两个字节

        GBK:中文编码表升级,融合了更多的中文文字富豪

        Unicode:国际标准码,融合了多种文字

                 所有文字都用两个字节来表示,Java使用的就是Unicode

        UTF-8:最多用三个字节来表示一个字符

                 (增加了标识,节省空间)

                

        非常重要:开发时编码转换非常常见

       如果用utf-8编码区读gbk的文件,可以读出来,但是会乱码(未知字符)

        如果用GBK编码读取utf文件,也可以读出来,会多出一个字符

import java.io.*;

public class H_CodeTable {

    public static void main(String[] argsthrows IOException {

        writeText();

        readText();//读出来是 浣犲ソ

    }

    public static void readText() throws IOException

    {

        InputStreamReader isr=new InputStreamReader(new FileInputStream("1-utf.txt"),"gbk");

        char[] buf=new char[1024];

        int len=0;

        while((len=isr.read(buf))!=-1)

        {

            System.out.println(new String(buf,0,len));

        }

        isr.close();

    }

    public static void writeText() throws IOException

    {

        OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("1-utf.txt"),"utf-8");

        osw.write("你好");

        osw.close();       

    }  

}


2.       转换错误分析

2.1  编码:字符串编程字节数组

解码:字节数组编程字符串

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

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

2.2  "你好"的gbk编码和utf编码

 gbk[-60, -29, -70, -61]

utf[-28, -67, -96, -27, -91, -67]

所以当“你好”用utf编译的时候,得到了6个字节编码,再用GBK解码编程了3个字符。

解决方式:
        

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

 

public class H_07CodeTrans {

    public static void main(String[] argsthrows IOException {

        //编码   获得”你好“的gbk编码和utf编码

        String s="你好";

        byte[] b=s.getBytes();

        //byte[] b=s.getBytes("ISO8859-1");

        System.out.println("gbk"+Arrays.toString(b));

        byte[] b1=s.getBytes("utf-8");

        System.out.println("utf"+Arrays.toString(b1));     

       

        //解码

        String s1=new String(b1,"utf-8");

        //乱码已经产生   如何解决因为查表错误产生的乱码

        //利用原编码表获取编码

        //用正确的编码表解码    

        System.out.println(s1);//默认gbk

    }

}


结果:

gbk[-60, -29, -70, -61]

utf[-28, -67, -96, -27, -91, -67]

你好

3.       “联通”乱码问题

打开记事本输入“联通”,保存后再打开,显示乱码。

原因:

import java.io.IOException;

import java.io.UnsupportedEncodingException;

public class H_08Encode {

    public static void main(String[] argsthrows IOException {

        String s="联通";

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

        for(byte b:by)

        {

            System.out.println(Integer.toBinaryString(b&255));

        }  

    }

}


结果:

11000001

10101010

11001101

10101000

         正常应该是GBK编码,但是刚好符合了UTF-8的编码规则,因此被用UTF-8解码,产生乱码。

0 0
原创粉丝点击