string 转 byte 的问题

ernst20020530 2009-12-30 05:27:06
我现在要从文件里读取汉字,我以二进制读入内存,然后把byte[]转化成String,但是从String转会byte[]的时候有些字符byte的值变了,

for(int i=0;i<buffer.length/2;i++){
byte[] strByte=new byte[2];
byte[] strByte2;
strByte[0]=buffer[2*i];
strByte[1]=buffer[2*i+1];
String str=new String(strByte);
System.out.println(str);
alStr.add(str);
strByte2=str.getBytes();
System.out.print(i+":");
System.out.print(Integer.toHexString((int)strByte[0]&0xff)+"\t");
System.out.println(Integer.toHexString((int)strByte[1]&0xff));
System.out.print(i+":");
System.out.print(Integer.toHexString((int)strByte2[0]&0xff)+"\t");
System.out.println(Integer.toHexString((int)strByte2[1]&0xff));
}

帮我看看是什么问题,谢谢
...全文
83 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xllee 2010-01-23
  • 打赏
  • 举报
回复
这是基础,回顾学习了
ernst20020530 2009-12-30
  • 打赏
  • 举报
回复
3樓真是高手的,佩服的五體投地
真哥哥 2009-12-30
  • 打赏
  • 举报
回复
3楼厉害啊
heartraid86 2009-12-30
  • 打赏
  • 举报
回复
ls大牛,这篇文章我拜读了,很详细。
darxin 2009-12-30
  • 打赏
  • 举报
回复
楼主在讨论String与byte[]之间的关系前,首先要明确两点:
String中的每一个元素(char)总是使用unicode进行编码的;
如果要在byte[]中保存字符信息,必须明确byte[]所使用的字符集。

以楼主的代码为例,楼主首先要明确buffer中保存的是使用哪一种字符集编码的字节数据流?
从byte[]数据转成String时,可使用下面的方式:
String str=new String(buffer, Charset.forName("UTF-8"));
前提是你认为buffer中的字节数据是使用UTF-8编码的;

如果你认为buffer中的字节数据是GBK编码的,就可用下面的代码代替:
String str=new String(buffer, Charset.forName("GBK"));

不要使用不带参数的构造器生成字符串,如:
String str=new String(buffer);
因为这种方式系统会使用默认字符集对buffer进行处理,不同的操作系统不同的语言环境,默认字符集是不一样的。

如上所述,从String转到byte[]时,也要考虑字符集问题。
也就是说,当你要将String转到byte[]时,首先要问一下自己,我要生成的byte[]数据是使用哪一种字符集编码的?例如使用UTF-8编码时,可以用下面的代码表示:



另外只有unicode编码字节化数据流是每两个byte表示一个字符(char)的。

如果楼主认为buffer中保存的是
byte[] tmp = str.getBytes(Charset.forName("UTF-8"));

同样道理,不可使用不带参数的getBytes方法,原因是代码不明确!

关于这方面的详细说明,可参考Java字符串与字符集的基本概念一文。
ouyangyh 2009-12-30
  • 打赏
  • 举报
回复
Java中String的编码非常特殊
它并不是每个字符都占两个字节
像标准的ASCII码,只占一个字节
具体的,要参考一些手册
ernst20020530 2009-12-30
  • 打赏
  • 举报
回复
还有,我从文件里用readline读入的字符串也有问题,读进来马上按String写到文件里也出问题和原来不一样,请问应该怎么从文件里读取汉字,GBK码

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧