• java乱码问题


    乱码往往是字符集不统一造成的,而笔者的程序中却是另一种情况引起的。message += (char)ins.read(); 
    就是因为这句代码。。。 
    原因是这样的:用char强制转型时,只能转换0—127之间的ASCII码,而我们的中文(在GBK/GB2312字符集中中文由两个字节表示,而这连个字节不再0-127范围之内)的字节经char强制转型出来的就是“?”了。 
    对此我的解决方案是把每个对到的字节都放入字节队列中,在转成数组,最后用String(bytes[])转成字符串。代码如下 

    Java代码  收藏代码
    1.                          read = bufferedInputStream.read();  
    2.                         byte byte1 = (byte)read;  
    3. bytes.add(byte1);  
    4. messageRead = new String(listToBytes(bytes));  



    代码中的bytes是字节队列,listToBytes是队列转成数组的方法。 

    下面我说一下上面提及通常的原因。 
    首先,我先介绍一下几种java中的常用的字符集:GBK,GB2312,ASCII,ISO-8859-1,UTF-8。。 
    要保证不乱码,我们首先要掌握不同字符在他们的字符集中占的字节个数。 
    GBK:英文占1字节,中文占2字节 
    GB2312:同GBK 
    ASCII:总长7bit。。一共包括0-127的字符。。占1字节。无法表示中文。 
    ISO-8859-1:总长8bit。。是ASCII的扩展。。占1字节 
    UTF-8:英文占1字节。中文占3字节。 
    代码实例: 

    public static void compareCharset() {  
        byte[] bytes1, bytes2, bytes3, bytes4, bytes5, bytes6, bytes7;  
        String string = "a马";  
        try {  
            bytes1 = string.getBytes("GBK");  
            System.out.println("以GBK编码程字节长度为" + bytes1.length);  
            for (int i = 0; i < bytes1.length; i++) {  
                System.out.println("以GBK编码每个字节是" + bytes1[i]);  
            }  
            bytes2 = string.getBytes("GB2312");  
            System.out.println("以GB2312编码程字节长度为" + bytes2.length);  
            for (int i = 0; i < bytes2.length; i++) {  
                System.out.println("以GB2312编码每个字节是" + bytes2[i]);  
            }  
            bytes3 = string.getBytes("ISO-8859-1");  
            System.out.println("以ISO-8859-1编码程字节长度为" + bytes3.length);  
            for (int i = 0; i < bytes3.length; i++) {  
                System.out.println("以ISO-8859-1编码每个字节是" + bytes3[i]);  
            }  
            bytes4 = string.getBytes("ASCII");  
            System.out.println("以ASCII编码程字节长度为" + bytes4.length);  
            for (int i = 0; i < bytes4.length; i++) {  
                System.out.println("以ASCII编码每个字节是" + bytes4[i]);  
            }  
            bytes5 = string.getBytes("UTF-8");  
            System.out.println("以UTF-8编码程字节长度为" + bytes5.length);  
            for (int i = 0; i < bytes5.length; i++) {  
                System.out.println("以UTF-8编码每个字节是" + bytes5[i]);  
            }  
            bytes7 = string.getBytes("UNICODE");  
            System.out.println("以UNICODE编码程字节长度为" + bytes7.length);  
            for (int i = 0; i < bytes7.length; i++) {  
                System.out.println("以UNICODE编码每个字节是" + bytes7[i]);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
            System.out.println("有不支持的字符集存在");  
        }  
    }  
    

      


    打印出来是: 
    以GBK编码程字节长度为3 
    以GBK编码每个字节是97 
    以GBK编码每个字节是-62 
    以GBK编码每个字节是-19 
    以GB2312编码程字节长度为3 
    以GB2312编码每个字节是97 
    以GB2312编码每个字节是-62 
    以GB2312编码每个字节是-19 
    以ISO-8859-1编码程字节长度为2 
    以ISO-8859-1编码每个字节是97 
    以ISO-8859-1编码每个字节是63 
    以ASCII编码程字节长度为2 
    以ASCII编码每个字节是97 
    以ASCII编码每个字节是63 
    以UTF-8编码程字节长度为4 
    以UTF-8编码每个字节是97 
    以UTF-8编码每个字节是-23 
    以UTF-8编码每个字节是-87 
    以UTF-8编码每个字节是-84 
    以UNICODE编码程字节长度为6 
    以UNICODE编码每个字节是-2 
    以UNICODE编码每个字节是-1 
    以UNICODE编码每个字节是0 
    以UNICODE编码每个字节是97 
    以UNICODE编码每个字节是-102 
    以UNICODE编码每个字节是108 

    在表示字符串的时候,我们尽量要保证字符集一致才不会乱码。。。

  • 相关阅读:
    github设置添加SSH
    windows下使用git管理github项目
    WGS84、Web墨卡托、火星坐标、百度坐标互转
    用IrisSkin2.dll美化你的WinForm
    GDAL读写矢量文件——Python
    GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现
    ArcGIS的地理坐标系与大地坐标系
    ArcGIS Engine生成等值线(C#)
    ArcMap等值面
    MongoDB介绍及安装
  • 原文地址:https://www.cnblogs.com/fengchuxiaodai/p/5396787.html
Copyright © 2020-2023  润新知