您的位置 首页 java

深入分析Java中String.getBytes()编码问题

String.get bytes () 方法返回一个 字符串 的字节数组,这个没有什么问题。但需要注意的是,该方法将返回操作系统默认的编码格式的字节数组。这样,在一个平台(如windows)上运行正常的系统,部署到另外一个平台(如 linux )上可能会产生问题。

一、getBytes() 方法

getBytes() 方法有两种形式:

getBytes(String charsetName): 使用指定的字符集将字符串 编码 为 byte 序列,并将结果存储到一个新的 byte 数组中。

getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

先看一段示例代码,以及其输出结果:

 package com.rickie;

public class GetBytesDemo {
    private String str = "Hello中国上海";

    public static void main(String[] args) {
        GetBytesDemo getBytesDemo = new GetBytesDemo();
        getBytesDemo.execute();
        getBytesDemo.execute2();
    }

    private void execute() {
        byte[] bytes = str.getBytes();
        System.out.println("bytes length is:" + bytes.length);
    }

    private void execute2() {
        byte[] bytesISO8859 = null;
        byte[] bytes GBK  = null;
        byte[] byteUTF8 = null;

        try {
            bytesISO8859 = str.getBytes("ISO-8859-1");
            bytesGBK = str.getBytes("GBK");
            byteUTF8 = str.getBytes("UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("ISO-8859-1: " + bytesISO8859.length);
        System.out.println(array toString (bytesISO8859));

        System.out.println("GBK: " + bytesGBK.length);
        System.out.println(arrayToString(bytesGBK));

        System.out.println("UTF-8: " + byteUTF8.length);
        System.out.println(arrayToString(byteUTF8));
    }

    public static final String arrayToString(byte[] bytes) {
        StringBuffer buff = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            buff.append(bytes[i] + " ");
        }
        return buff.toString();
    }
}  

上面我们将字符串分别提取ISO-8859-1、GBK、UTF-8三种编码格式的字节数组。

在Mac平台上,运行上述示例代码的输出结果:

深入分析Java中String.getBytes()编码问题

ISO-9985-1格式的字节数组长度为9,中文字符都变成了63,ASCII码为63的是符号?。在英文平台中,一般的默认编码是”ISO-8859-1″,每个字符都只取一个字节(而不管是否非拉丁字符)。GBK格式的字节数组长度为13,UFT-8编码格式的字节数组长度为17。

String采用一种灵活的方式进行存储。在String中,一个英文字符占1个字节,而中文字符根据编码的不同所占字节数也不同。在UTF-8编码下,一个中文字符占3个字节;而使用GBK编码时一个中文字符占2个字节。

二、通过new String(byte[], decode) 方式还原字符串

与getBytes() 方法相对应,可以通过 new String(byte[], decode) 来还原字符串,实际上是用decode指定的编码来将byte[] 解析成字符串。

对上面的代码进行更新,再次运行,查看输出结果。

 System.out.println("ISO-8859-1: " + bytesISO8859.length);
System.out.println(arrayToString(bytesISO8859));
System.out.println(new String(bytesISO8859, "ISO-8859-1"));

System.out.println("GBK: " + bytesGBK.length);
System.out.println(arrayToString(bytesGBK));
System.out.println(new String(bytesGBK, "GBK"));

System.out.println("UTF-8: " + byteUTF8.length);
System.out.println(arrayToString(byteUTF8));
System.out.println(new String(byteUTF8, "UTF-8"));  

下面是还原的字符串结果:

深入分析Java中String.getBytes()编码问题

只有ISO-8859-1编码输出的中文是?字符,为什么使用ISO-8859-1编码再组合之后,无法还原中文字呢?

其实原因很简单,因为ISO-8859-1编码的编码表中,根本就没有包含中文字符,当然也就无法通过getBytes(“ISO-8859-1″);来得到正确的中文在ISO-8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。

文章来源:智云一二三科技

文章标题:深入分析Java中String.getBytes()编码问题

文章地址:https://www.zhihuclub.com/181647.shtml

关于作者: 智云科技

热门文章

网站地图