Java中 getBytes() 和 new String() 的编码分析

1、getBytes()方法

        String的getBytes() 方法:得到一个操作系统默认编码的字节数组。所以在不同的操作系统下,返回的东西可能是不一样的!

        String.getBytes(String decode) 方法:根据指定的decode编码,返回该字符串在指定编码下的byte数组。

下面,我们用代码测试下:

分别返回"" 这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组,并查看数组的长度。来验证不同编码下区别。

public class Test {

    public static void main(String[] args) throws Exception {
        byte[] b_gbk = "中".getBytes("GBK");
        byte[] b_utf8 = "中".getBytes("UTF-8");
        byte[] b_iso88591 = "中".getBytes("ISO8859-1");

        System.out.println("GBK 编码的长度:"+b_gbk.length);
        System.out.println("UTF-8 编码的长度:"+b_utf8.length);
        System.out.println("ISO8859-1编码的长度:"+b_iso88591.length);
    }

}

运行结果:

GBK 编码的长度:2
UTF-8 编码的长度:3
ISO8859-1编码的长度:1

2、new String(byte[],decode)方法

        new String(byte[], decode) 方式,可以把 ""字通过getBytes方法得到的数组还原成字符串。

new String(byte[],decode) 方法的功能:就是使用指定的decode编码来将byte[]解析成字符串。

修改下代码:

public class Test {

    public static void main(String[] args) throws Exception {
        byte[] b_gbk = "中".getBytes("GBK");
        byte[] b_utf8 = "中".getBytes("UTF-8");
        byte[] b_iso88591 = "中".getBytes("ISO8859-1");

        String s_gbk = new String(b_gbk,"GBK");
        String s_utf8 = new String(b_utf8,"UTF-8");
        String s_iso88591 = new String(b_iso88591,"ISO8859-1");

        System.out.println("GBK 编码的字符串:"+ s_gbk);
        System.out.println("UTF-8 编码的字符串:"+ s_utf8);
        System.out.println("ISO8859-1编码的字符串:"+ s_iso88591);
    }

}

运行结果:

GBK 编码的字符串:中
UTF-8 编码的字符串:中
ISO8859-1编码的字符串:?

观察上面的结果,发现s_gbk和s_utf8可以还原出"中"字,而s_iso88591是?(可以理解为乱码)。

为什么使用ISO8859-1编码再组合之后,无法还原"中"字?

        那是因为 ISO8859-1 的编码表根本就不包含汉字字符,所以也就无法通过 "中".getBytes("ISO8859-1"); 来得到正确的"中"字在ISO8859-1中的编码值了。所以通过newString()来还原就更是无从谈起。

        因此通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。

那么如何使 iso8859-1编码 支持中文?

// 得到ISO8859-1编码字符
String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1")


// 还原,得到正确的中文汉字"中"
String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值