java字节数组转字符串乱码,java string 乱码

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: