在java项目中遇到String对象与byte[]数组之间转换的问题,尤其是中文的时候,遇到了一点点问题,经过调研,找到了正确的转换方法。
比较简单,实现如下:
String 转 byte[]
String strHello = "Hello World";
byte[] bHello = strHello.getBytes();
byte[]转String
String strHello = new String(bHello);
注意byte[]数组对象有一个toString()方法,一开始我很自然而然得用了这个方法想把byte字节数组转换成String字符串,但是发现转换之后得到的是一个地址值,而不是实际的内容。
稍微复杂一点,涉及到编码格式,实现如下:
中文 String 转 byte[]
String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如下:
String strChinese = "大吉大利";
byte[] bChinese_gbk = strChinese.getBytes("GBK"); //GBK编码格式
byte[] bChinese_utf8 = strChinese.getBytes("UTF-8"); // UFT-8编码格式
byte[] bChinese_iso88591 = strChinese.getBytes("ISO8859-1");
将分别返回“大吉大利”这些汉字在GBK、UTF-8、ISO8859-1编码下的byte数组表示。
通过new String(byte[], decode)的方式来还原“大吉大利”这些汉字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串。
String strChinese_gbk = new String(bChinese_gbk,"GBK");
String strChinese_utf8 = new String(bChinese_utf8,"UTF-8");
String strChinese_iso88591 = new String(bChinese_iso88591,"ISO8859-1");
通过打印strChinese_gbk、strChinese_utf8和strChinese_iso88591的值会发现,strChinese_gbk、strChinese_utf8都可以正常显示汉字,但是strChinese_iso88591却显示异常。这是因为ISO8859-1编码表中不包含汉字字符,所以无法将汉字转成正确的ISO8859-1中的编码值,也就无法通过new String()来还原汉字了。
因此,通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。
通过String的getBytes()方法是可以得到一个字符串的字节数组,但特别要注意的是,getBytes()方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点,你会发现原本运行正常的程序在换了运行环境后可能会遇到问题。
String与byte[]字节数组中文转换乱码问题