一个小问题,不是很重要,但是不懂,请教一下下

hellobbboy 2010-02-09 12:51:13
我那天瞎玩,发现个这事:

byte[] bytes={1,2,3};
String s=new String(bytes);
System.out.println(s);

打出来的是:
三个方框(我粘过来发现是,很神奇)

为什么捏?三克油。O(∩_∩)O~
...全文
231 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellobbboy 2010-02-10
  • 打赏
  • 举报
回复
筒子们,我明白了,经过大家启示:
那个貌似很吓人的回答是对的,呵呵。
就是当:
byte[] bytes={xx}
就是这个xx,当咱写{1,2,3}时,被认为是Ascii2码1,2,3,就是
Bin Dec Hex 缩写/字符 解释
00000000 0 00 NUL(null) 空字符
00000001 1 01 SOH(start of handling) 标题开始
00000010 2 02 STX (start of text) 正文开始
00000011 3 03 ETX (end of text) 正文结束

参看:http://baike.baidu.com/view/15482.htm

当咱写{'1','2','3'}时,它认为是字符,还是按照Ascii2码存储,就是
Bin Dec Hex 缩写/字符 解释
00110001 49 31 1
00110010 50 32 2
00110011 51 33 3

我try了一下:
byte[] bytes={49,50,51};
String s=new String(bytes);
System.out.println(s);
输出是:
123

还有位高人说:
System.out.println(""+(char)1+(char)2+(char)3)
结果也是三个框,我试了,是这样的。
就是在Java中char是按照Ascii编码的,所以强制转换后就变成了Ascii码的十进制表示方式:1,2,3。
所以
System.out.println(""+(char)0x01+(char)0x02+(char)0x03);
System.out.println(""+0x01+0x02+0x03);
输出是:
三个框
123


呵呵,归根结底是当我们给byte数组赋值时,它以Ascii编码成二进制存在内存中。
比如:
{49,50,51}//十进制
{'1','2','3'}//字符
{0x31,0x32,0x33}//十六进制
(二进制没试出来,(⊙o⊙)…)
但是我估计它们都被Ascii2编码成二进制:00110001 , 00110010 ,00110011 存入内存中,
然后就是取出来解码,这就涉及到解码,
数据->某种编码方式->二进制机器码->某种解码方式->数据
要是编码方式和解码方式不对照,就会出现传说中的乱码咯。
(感觉这东西应该是灰常基础滴,唉,伤感ing)

应该注意的是通常给byte单独赋值时:
byte b=1;
System.out.println(b);
输出是:
1

还有一个很有趣的现象:
当我从Eclipse的控制台上将三个框赋值,粘贴到这里,变成了
,有没有高人给个解释?

最后谢谢大家,祝大家新年快乐,\(^o^)/~
冰思雨 2010-02-10
  • 打赏
  • 举报
回复
字符编码为题呗。
数字的字符编码,一般不会编成对应的值。
数字、字节和字符这三个数据类型是要区分开来滴。
String的构造器,楼主可以观察一下它的源码,这种调用,实际上是按照系统默认编码进行转换的。
也就是说,如果你的系统默认是GBK编码,那么,它会将这三个字节,按GBK编码来转换成字符串。
楼主可以查一下字符编码对照表,就可以了。
当然,我们知道GBK编码,当当前字节,其对应的数值小于128时,是与ACSII编码相同的。
由于LZ举得例子都满足上述条件,所以,只要查询ACSII字符编码对照表即可了。
因为,对应的不是我们经常看到的字符,所以显示出来比较怪异。
WPooh 2010-02-10
  • 打赏
  • 举报
回复
看看API中有关String()构造函数可能会有帮助。
zl3450341 2010-02-10
  • 打赏
  • 举报
回复
引用 1 楼 bao110908 的回复:
那是控制字符,是不可显示的。

1 是 SOH, start of heading
2 是 STX, start of text
3 是 ETX, end of text

20H 以下的字符都是不可显的控制字符。

。厉害 !
涨见识了
kasper360 2010-02-10
  • 打赏
  • 举报
回复
这么神奇,长见识了。。。
focusforce 2010-02-10
  • 打赏
  • 举报
回复
哇哈哈,学习了,很诡异啊。
  • 打赏
  • 举报
回复
哎,为啥不一样?

这些都是控制字符,根本不可能显示的!

像“10”是个“换行符”,只能显示成一个换行,不可能显示成一个字符的吧?“9”是个“TAB”,显示出来就是一个跳格符
lulu5255 2010-02-10
  • 打赏
  • 举报
回复
欸,怪异幺?
想这些干嘛?
BigKing911 2010-02-10
  • 打赏
  • 举报
回复
引用 1 楼 bao110908 的回复:
那是控制字符,是不可显示的。

1 是 SOH, start of heading
2 是 STX, start of text
3 是 ETX, end of text

20H 以下的字符都是不可显的控制字符。


byte[] bytes = { 1, 2, 3 ,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
String s = new String(bytes);
System.out.println(s);
我又用这个试了下,发现打印出来的是:




貌似和您说的不一样呀!
greatmind829 2010-02-09
  • 打赏
  • 举报
回复
不知道 。。
帮你顶。。
  • 打赏
  • 举报
回复
那是控制字符,是不可显示的。

1 是 SOH, start of heading
2 是 STX, start of text
3 是 ETX, end of text

20H 以下的字符都是不可显的控制字符。
Arbonc 2010-02-09
  • 打赏
  • 举报
回复
byte[] bytes={1,2,3};
String s=new String(bytes);
System.out.println(""+(char)1+(char)2+(char)3);

跟这段程序一样,你对照一下就知道其中的原因了,
javafamily_2010 2010-02-09
  • 打赏
  • 举报
回复
1,2,3和'1','2','3'应该不一样吧,1,2,3是指的ascii码吧
深山老叔 2010-02-09
  • 打赏
  • 举报
回复
编码问题吧。。。


CSDN--->哥们,请不要恶意灌水
ME---->无语。。。
liu4545533 2010-02-09
  • 打赏
  • 举报
回复
ASCII值吧,去翻一下ascii表
dracularking 2010-02-09
  • 打赏
  • 举报
回复
对啊 大部分系统默认编码无外乎gb系列 iso-8859-1 utf-8等 对于单字节都是按ascii规则映射
如果其它一些就不一样了
wl_ldy 2010-02-09
  • 打赏
  • 举报
回复
哦 没有碰到过 ,不过 结果确实如LZ所说。。。
bobo364 2010-02-09
  • 打赏
  • 举报
回复
String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
bobo364 2010-02-09
  • 打赏
  • 举报
回复
String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
wowwow_cai 2010-02-09
  • 打赏
  • 举报
回复
String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
1,2,3经过解码,都是不可显的控制字符。

就像用简体系统玩繁体游戏,出乱码差不多。
加载更多回复(4)

62,614

社区成员

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

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