怎么解决java中byte[]转成String的乱码问题
怎么解决java中byte[]转成String的乱码问题?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。
创新互联建站专注于企业全网营销推广、网站重做改版、陕西网站定制设计、自适应品牌网站建设、HTML5、商城网站制作、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为陕西等各大城市提供网站开发制作服务。
首先常用的byte[]直接转String很简单:
public static void main(String[] args) { String str="我是中国人"; byte[] arr=str.getBytes(); System.out.println("打印:"+arr); for(byte e : arr) { System.out.print(e + " "); } String str2=new String(arr); System.out.println("\n打印2:"+str2); }
比如上面这个,输出的结果是:
打印:[B@15db9742 -50 -46 -54 -57 -42 -48 -71 -6 -56 -53 打印2:我是中国人
看到这个就知道编码了。byte是一个字节,汉字是两个字节。所以五个汉字要十个byte类型的数字存储。然后数字变成汉字,这中间就是走了一个编码规范的过程。
java中是如何处理字符编码的?
JAVA使用自己的String类,并且String类对象是不需要指定编码表的!为什么它会自己知道一堆数字各代表什么字符呢?就是因为String里的字符信息是用UNICODE编码存放的。而JAVA为了表示字符(注意是单个字符),也有char这个数据类型,而且他的大小是固定2个8位16进制数字长度,也就是0~65535。为的就是对应UNICODE里面的一个字符。
大家如果想取一个String里的按UNICODE数字,可以用getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
方法取得一个char[],这个char[]里就是表示String字符的,按UNICODE编码表编码的数字。
为什么byte[ ]转String会出现乱码现象?
很显然,就是上面提到的,编码规范不一样。举个栗子,比如GB2312规范的中文“当”字,就是用0xB5,0xB1这两个八位的数字来表示的。在英文系统上,没有GB2312编码表,给他一个0xB5,0xB1,他就傻傻的当作ASCII来处理。放到Java里,他又会按照自己的UNICODE规范来处理,所以规范不一样,就会出现奇怪的结果,也就是乱码。
怎么解决byte[ ]转String的乱码问题呢?
得看byte[]来自哪里了。时常会遇到,要把一张图片转为byte[]然后在转为String流对象传输到别的地方,接收者再转为byte[]再变成图片。
1、直接传输byte[]的话,会出现byte[]过长数据丢失。因为不是所有的byte组合都可以映射成char。
2、用常见的Base64编码规范吧。base64的编码规范就是将常见的字符转换成6位二进制表示(常用64个所以叫base64吧)。怎么写,有现成的工具类哦如下:
import org.apache.commons.codec.binary.Base64; public class UtilHelper { //base64字符串转byte[] public static byte[] base64String2ByteFun(String base64Str){ return Base64.decodeBase64(base64Str); } //byte[]转base64 public static String byte2Base64StringFun(byte[] b){ return Base64.encodeBase64String(b); } }
这样就可以保证byte[]和String之间的标准转换了。
关于解决java中byte[]转成String乱码问题的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
网站标题:怎么解决java中byte[]转成String的乱码问题
本文网址:http://scyanting.com/article/jeeisd.html