抽空写了个java的字符串转码方法,可转换unicode到任意编码的字节

工作中经常遇到不同系统之间的通讯,当两个系统使用不同的编码时数据的接收必定有一方需要做转码。

下面的代码就是在java中对字符串转化为指定编码的字节数组。

public class StringEncodeUtils {

    /**
     * 字符串转化为指定编码的字节数组
     *
     * @param text
     *          被转换的字符串,Unicode编码的任意字符串。注意使用的前提是text不是乱码内容。
     * @param encoding
     *          指定的编码,如:UTF-8,GBK
     * @return
     *          转换成功返回字节数组,否则返回NULL
     */
    public static byte[] getBytes(String text, String encoding){
        ByteArrayOutputStream byteOut = null;
        StreamEncoder encoder = null;
        byte[] bts = null;

        try {
            byteOut = new ByteArrayOutputStream();
            encoder = StreamEncoder.forOutputStreamWriter(byteOut, new Object(), Charset.forName(encoding));
            encoder.write(text);
            encoder.flush();
            encoder.close();

            bts = byteOut.toByteArray();
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
            return null;
        }catch(IOException e){
            e.printStackTrace();
            return null;
        }finally {
            try {
                if(encoder != null) encoder.close();
            }catch (Exception e1){}
            try {
                if(byteOut != null) byteOut.close();
            }catch (Exception e1){}
        }

        return bts;
    }

    public static void main(String[] args) throws Exception{
        String utf8Text = "乾";
        String encoding = "GBK";
        byte[] bts = getBytes(utf8Text, encoding);
        String gbkText = new String(bts,encoding);

        System.out.println(Integer.toHexString(bts.length));
        System.out.println(Integer.toHexString(gbkText.charAt(0)));
        System.out.println(new String(getBytes(utf8Text,encoding),encoding));

    }
}


原理就是利用系统自带的转换流对字符串转码。

至于什么是“Unicode编码的任意字符串”嘛,在JAVA的内容里面只有一种编码就是Unicode,所以不管来源是GBK还是UTF-8到了java内存统统都是Unicode,这个是java自动转的,当然结果是不是乱码系统可就不管的。

所以使用此方法转码前,必须确保传入的是非乱码字符串,不然结果的字节数组肯定是错的了。

至于JAVA里面的各种字符串乱码,不在本文讨论之列。

提交评论