java中String和byte[]中文转换的问题

1.简介

在java项目中遇到String对象与byte[]数组之间转换的问题,尤其是中文的时候,遇到了一点点问题,经过调研,找到了正确的转换方法。

2.不含中文的String对象与byte[]数组之间转换

比较简单,实现如下:

  • String 转 byte[]

    String strHello = "Hello World";
    byte[] bHello = strHello.getBytes();
    
  • byte[]转String

    String strHello = new String(bHello);
    

    注意byte[]数组对象有一个toString()方法,一开始我很自然而然得用了这个方法想把byte字节数组转换成String字符串,但是发现转换之后得到的是一个地址值,而不是实际的内容。

3.包含中文的String对象与byte[]数组之间转换

稍微复杂一点,涉及到编码格式,实现如下:

  • 中文 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数组表示。

  • byte[] 转中文 String

通过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[]数组才能正确被还原。

4.注意

通过String的getBytes()方法是可以得到一个字符串的字节数组,但特别要注意的是,getBytes()方法将返回该操作系统默认的编码格式的字节数组。如果你在使用这个方法时不考虑到这一点,你会发现原本运行正常的程序在换了运行环境后可能会遇到问题。

5.参考

String与byte[]字节数组中文转换乱码问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值