java字节数组转字符串乱码,java string 乱码
首先,直接把byte[]转换成String非常简单:
公共静态void main(String[] args) {
String str=我是中国人;
byte[]arr=str . getbytes();
system . out . println( print: arr );
for(字节e : arr) {
system . out . print(e );
}
String str2=新字符串(arr);
system . out . println( \ n print 2: str 2 );
}java相关视频推荐:java学习
比如上面那个,输出结果是:
打印:[B@15db9742
-50 -46 -54 -57 -42 -48 -71 -6 -56 -53
2:我是中国人。我看到这个就知道密码了。字节是一个字节,汉字是两个字节。所以五个汉字需要十个字节类型的数字存储。然后数字变成汉字,这是一个编码标准化的过程。
那么java中是如何处理字符编码的?
JAVA使用自己的字符串类,字符串类对象不需要指定编码表!为什么它自己知道一串数字代表什么字符?因为字符串中的字符信息是以UNICODE编码存储的。为了表示字符(注意是单个字符),JAVA还有数据类型char,大小是两个固定的8位十六进制数字,即0~65535。对应于UNICODE中的一个字符。
如果你想得到一个字符串中的UNICODE数字,你可以使用getchars (int src begin,int src end,char[] dst,int dst begin)方法得到一个char[]。这个char []是表示字符串字符的数字,根据UNICODE编码表进行编码。
为什么会出现byte[ ]转String又会出现乱码现象?
显然,如上所述,编码规范是不同的。以栗子为例。比如GB2312中的汉字“当”用两个八位数字表示:0xb5和0xb1。在英制上,没有GB2312编码表。给他一个0xb5和0xb1,他会傻乎乎地当成ASCII。如果你放在Java里,他会按照他的UNICODE规范来处理,所以如果规范不一样,就会出现奇怪的结果,就是乱码。
那么我们怎么解决byte[ ]转String的乱码问题呢?
取决于byte[]来自哪里。经常会遇到一张图片需要转换成byte[]然后作为String stream对象传到其他地方,接收方再转换成byte[]然后变成图片。
1.如果byte[]直接传输,byte[]会太长,数据会丢失。因为不是所有的字节组合都能映射到char。
2.使用通用的Base64编码标准。base64的编码规范是将常用字符转换成6位二进制表示(常用64位字符,故称为base64)。怎么写,有现成的工具类如下:
导入org . Apache . commons . codec . binary . base64;
公共类UtilHelper {
//base64字符串到字节[]
public static byte[]base64 String 2 byte fun(String base64 str){
返回base64 . decode base 64(base64 str);
}
//byte[]到base64
公共静态字符串byte2Base64StringFun(byte[] b){
返回base64 . encode base 64 string(b);
}
}这将确保byte[]和String之间的标准转换。
更多相关文章和教程推荐:java Zero Foundation入门。以上是java中byte[]到String的乱码细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。