请教各位byte数组与字符串转换的问题?谢谢。

luoxiang2000 2010-11-08 11:51:21
一个字符串数组,先转换成String,然后转换回来,有些byte就不对了,很奇怪,哪位能指点一下,多谢。
代码如下:

byte[] bArray2 = new byte[]{-5, 46};
String s = new String(bArray2);
byte[] bArray3 = s.getBytes();


bArray3和bArray2中的内容不一样,bArray3中为:63,46.
?????????????????
...全文
251 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuyouyong 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dreamhunter_lan 的回复:]
编码方式上有问题吧,java用两个字节表示一个字符。似乎会在这句上发生一些变化:
char[] v = StringCoding.decode(charset, bytes, offset, length);
具体情况不清楚,试了下UTF-8不行,换了ISO-8859-1就好了~
public class Test {
public static void main(String args……
[/Quote]ding
风影萧诺 2010-11-09
  • 打赏
  • 举报
回复
就是那样转的。。。。
liukelin 2010-11-09
  • 打赏
  • 举报
回复
不怎么懂这里
lpl071403004 2010-11-09
  • 打赏
  • 举报
回复
wcwtitxu 2010-11-09
  • 打赏
  • 举报
回复
iso-8859-1 是对 ascii 的扩展,从 1-255, 共编入 255 个字符。

而 0 仍然作为特殊字符 '\0'

也就是说从 0-255 无论哪个值都能够正常的解释成 String 能表示的字符。

解码后,再编码自然没有问题

所以, new String(bytes, "iso-8859-1").getBytes("iso-8859-1") == bytes
wcwtitxu 2010-11-09
  • 打赏
  • 举报
回复
new String(bytes)

按平台默认的编码,对字节序列进行解码操作。
在 windows 平台上,默认为 GBK;

因为你传入的是 [-5, 46]
-5 不对应 gbk 集中的任何字符, 故解码时,用 "?" 问号进行填充。
46 是 "."
解码后,得到 "?."

----------------------------------

"?.".getBytes() 得到 [63,46] 应该不奇怪吧




----------------------------------
从这里也可以看出,

当对字节序列进行解码时,如果应用了不正确的编码规则,将可能带来不可挽回的损失.
qybao 2010-11-09
  • 打赏
  • 举报
回复
ISO-8859-10也叫Latin-1,是西欧语言编码,编码范围在0x00-0xFF,也就是说属于单字节字符
gbk,unicode等其他的,属于双字节编码,也就是用两个byte来存一个汉字(或其他字)的编码
utf-8是一种变字节编码,也就是说根据不同的字用不同长度的byte来存储,一般可用到3个byte
Jlins 2010-11-09
  • 打赏
  • 举报
回复
使用 iso-8859-1 编码 一个字节一个字节的处理是不会乱的
utf-8 好像是3个字节一起处理...
gbk 应该是2个字节....
luoxiang2000 2010-11-09
  • 打赏
  • 举报
回复
谢谢。我昨天也觉得是编码问题,试过了utf-8等等编码,就是没有试过"ISO-8859-1"。真是奇怪。
哪位知道为什么?
blazingfire 2010-11-09
  • 打赏
  • 举报
回复
只有单字节解码(如:iso-8859-1)才可以的。你那不指定编码时,我试了一下应该用的是gbk。
具体你可以看看gbk编码规范。
安心逍遥 2010-11-09
  • 打赏
  • 举报
回复
帮顶,不懂。祝楼主好运
wind_rosebush 2010-11-09
  • 打赏
  • 举报
回复
最应该重视的就是这一点一滴的小知识,学习中。。。
quanquanfly 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dreamhunter_lan 的回复:]

编码方式上有问题吧,java用两个字节表示一个字符。似乎会在这句上发生一些变化:
char[] v = StringCoding.decode(charset, bytes, offset, length);
具体情况不清楚,试了下UTF-8不行,换了ISO-8859-1就好了~
public class Test {
public static void main(String arg……
[/Quote]

楼上的正解
dreamhunter_lan 2010-11-09
  • 打赏
  • 举报
回复
编码方式上有问题吧,java用两个字节表示一个字符。似乎会在这句上发生一些变化:
char[] v = StringCoding.decode(charset, bytes, offset, length);
具体情况不清楚,试了下UTF-8不行,换了ISO-8859-1就好了~
public class Test {
public static void main(String args[]) throws Exception{
byte[] bArray2 = new byte[]{-5, 46};
String s = new String(bArray2, "ISO-8859-1");
byte[] bArray3 = s.getBytes("ISO-8859-1");
System.out.println(bArray3[0]+", "+bArray3[1]);
}
}

62,634

社区成员

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

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