有关编码(GBK、utf-8、iso8859-1、)相互转换问题

来源:互联网 发布:淘宝店铺招牌代码 编辑:程序博客网 时间:2024/06/06 00:05

这是我的第一篇博客,写的不好与不足的地方,请大家提出问题和意见,请大家支持。

下面以一个典型的java例子讲述一下字符集编码之间的转换等。代码比较长,但简单明了。

代码主要说明以下一些内容:

1.main1()方法(只调用):将”中文“二字以指定字符集(GBK)编码,一个汉字转换为两个GBK字符码(编码到byte序列)、输出,然后再通过GBK把byte序列解码为字符串(又得到中文)

2.main2()方法(只调用):将将”中文“二字以指定字符集(utf-8)编码,一个汉字转换为3个utf-8字符码(编码到byte序列)、输出,然后再通过utf-8把byte序列解码为字符串(又得到中文)

(1与2)总结:总结:中文以什么字符集转码,最后还要以该字符集转回,才能得到原中文

3.main3()方法(只调用):是进行  GBK-->utf-8-->GBK的转换,先以GBK字符集编码到byte序列、输出,再将得到的byte序列以utf-8字符集编码到byte序列(注意:这中间并没有发生数据丢失)、输出。utf-8是把一个汉字转化为三个字节,这时在想用GBK转回来的话,windows会按照每两个字节进行转化为GBK,这样就会出现3个乱字。(如果出现三个乱字,要先把乱字转回字符码,由GBK转回原来的,即转回utf-8下的字符码)最后通过utf-8把byte序列解码为字符串。

4.main4()方法(只调用):是进行GBK-->iso8859-1-->utf-8-->iso8859-1-->GBK的转换,道理也是和main3()方法雷同,main4()请读者结合注释请自行揣摩练习。

package Test;
public class TestB {
    static String zhongwen = "中文";
    static byte[] bytes = null;
    
    public static void main(String[] args) throws Exception {
        // GBK
        //main1();
        // utf-8
        //main2();
        // GBK-->utf-8-->GBK
        //main3();
        // GBK-->iso8859-1-->utf-8-->iso8859-1-->GBK
        main4();

    }
    
    // GBK
    public static void main1() throws Exception {
        //使用指定字符集“GBK”将此字符串(以GBK的形式)编码到byte序列,并将结果存储到一个新的 byte 数组中。
        //(GBK是把一个汉字转化为两个字符码)
        bytes = zhongwen.getBytes("GBK");//通过字符集GBK将字符串编码为byte序列
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }//共得到4个字符码
        

        System.out.println(new String(bytes, "GBK"));//通过GBK把byte序列解码为字符串

    }

    
    // utf-8
    public static void main2() throws Exception {
        //使用指定字符集“utf-8”将此字符串(以utf-8的形式)编码到byte序列,并将结果存储到一个新的 byte 数组中。
                //(utf-8是把一个汉字转化为3个字符)
        bytes = zhongwen.getBytes("utf-8");//通过字符集utf-8将字符串编码为byte序列
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }

        System.out.println(new String(bytes, "utf-8"));//通过utf-8把byte序列解码为字符串
    }
    
    
    //-------------------------------------------------//
    //总结:中文以什么字符集转码,最后还要以该字符集转回,才能得到原中文
    //-------------------------------------------------//
    

    

    
    
    
    // GBK-->utf-8-->GBK
    public static void main3() throws Exception {
        //GBK
        bytes = zhongwen.getBytes("GBK");//通过字符集GBK将字符串编码为byte序列
        System.out.println("--------GBK----------");
        for (int i = 0; i < bytes.length; i++) {
            //以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式
            System.out.println(Integer.toHexString(bytes[i]));
        }
        
        //GBK->utf-8
        bytes = zhongwen.getBytes("utf-8");//通过字符集utf-8将字符串(上一步GBK下的乱字)编码为byte序列
        //注意:这中间并没有发生字节码的丢失
        byte [] bytes_copy = bytes;
        System.out.println("-------utf-8--------");
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }
        
        //错误的组装方法
        //utf-8是把一个汉字转化为三个字节,这时在想用GBK转回来的话,windows会按照每两个字节进行转化为GBK,这样就会出现3个乱字
        System.out.println("-------error GBK--------");
        zhongwen = new String(bytes, "GBK");//通过GBK把utf-8序列解码为字符串
        System.out.println("乱字:" + zhongwen);//转为三个乱字
        
        //再把乱字转回字字符码
        bytes = zhongwen.getBytes("GBK");//由GBK转回原来的,即转回utf-8下的字符码
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }
        
        //正确的组装方法
        System.out.println("-------GBK--------");
        System.out.println(new String(bytes, "utf-8"));//通过utf-8把byte序列解码为字符串
        //System.out.println(new String(bytes_copy, "utf-8"));
    }

    
    // GBK-->iso8859-1-->utf-8-->iso8859-1-->GBK
    public static void main4() throws Exception {
        
        System.out.println(zhongwen);
        //最开始是GBK
        bytes = zhongwen.getBytes("GBK");        
        System.out.println("--------GBK字符码----------");
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }
        
        //被组装成了iso8859-1,new出的字符串对象有问题,但是字节内容没变
        System.out.println("-------iso8859-1字符码--------");
        zhongwen = new String(zhongwen.getBytes("GBK"), "iso8859-1");//把中文转化为iso8859-1输出
        System.out.println(zhongwen);//得????四个问号,四个字符
        bytes = zhongwen.getBytes("iso8859-1");
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }
        //转换成utf-8在网络上传输,一个byte(?)转换为两个字节,所以一共8个字节
        bytes = zhongwen.getBytes("utf-8");
        System.out.println("-------utf-8字符码--------");
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }
        
        //server端接收到utf-8,首先组装成iso8859-1,new出的字符串对象有问题,显示4个问号
        System.out.println("-------server--iso8859-1字符码------");
        zhongwen = new String(bytes, "utf-8");
        System.out.println(zhongwen);
        bytes = zhongwen.getBytes("iso8859-1");
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(Integer.toHexString(bytes[i]));
        }
        
        //以iso8859-1得到字节,并组装成GBK
        System.out.println("-------GBK字符码--------");
        System.out.println(new String(bytes, "GBK"));
        
        //整个过程就是汉字->GBK字符集码->还原汉字再以iso8859-1字符集码转->不还原,在iso8859-1的基础上转utf-8字符集码->
        //在utf-8基础上还原一步,得到iso8859-1字符集码对应的字符串(????)和字符集码->(iso8859-1得到的是字节4个)在转为
        //GBK(组装两个字节为一个字)显示字符串
    }




    public static void ____________________main() throws Exception {
        System.out.println(System.getProperty("file.encoding"));
        System.out.println(System.getProperty("user.language"));
        System.out.println(System.getProperty("user.region"));
    }

}

阅读全文
0 0
原创粉丝点击