我那天瞎玩,发现个这事: byte[] bytes={1,2,3};
String s=new String(bytes);
System.out.println(s);打出来的是:
三个方框(我粘过来发现是,很神奇)为什么捏?三克油。O(∩_∩)O~
String s=new String(bytes);
System.out.println(s);打出来的是:
三个方框(我粘过来发现是,很神奇)为什么捏?三克油。O(∩_∩)O~
解决方案 »
- myeclipse6.5里如何调试,并调试当中如何查看某个变量的值~?
- 环境变量问题 请高手指点
- 绝对奇怪问题,做java很久了,奇怪问题遇到不少
- 求救,UndeclaredThrowableException异常,请教如何解决??
- 有关JAVA音频播放的问题,请教!
- Calendar的setTime方法、computeTime方法、updateTime、isLenient方法的作用??
- 高分求助:谁用过poolman??~~~~~见者有分~~~~~谢谢!
- 200分救命呀,如何能唯一获得选择的JTree的结点呀,分不够再给,过年了嘛
- 求JDBC的Insert语句的正确写法!!立刻给分
- 哪位大侠帮看看资源回收问题
- 一道简单的基础题,看你能做对吗?
- 如何用java 在 Lotus 中开发
2 是 STX, start of text
3 是 ETX, end of text20H 以下的字符都是不可显的控制字符。
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes) 构造一个新的 String,方法是使用平台的默认字符集解码字节的指定数组,该方法无法将字节正确转换为字符。
你在String这个构造函数中传进来的参数是个byte[]的引用,然后String s=new String(bytes);
即调用上面这个构造函数
所以打印结果是个不可预知的字符,你再次执行可能就是另外的字符,一样不可预知
不知楼主明白了没有,没事多看看API,JAVA的好处就是把一些方法内部的信息都封装好了,你会查会用就OK了,so easy
Constructs a new String by decoding the specified array of bytes using the platform's default charset.
1,2,3经过解码,都是不可显的控制字符。就像用简体系统玩繁体游戏,出乱码差不多。
如果其它一些就不一样了
CSDN--->哥们,请不要恶意灌水
ME---->无语
String s=new String(bytes);
System.out.println(""+(char)1+(char)2+(char)3); 跟这段程序一样,你对照一下就知道其中的原因了,
数字的字符编码,一般不会编成对应的值。
数字、字节和字符这三个数据类型是要区分开来滴。
String的构造器,楼主可以观察一下它的源码,这种调用,实际上是按照系统默认编码进行转换的。
也就是说,如果你的系统默认是GBK编码,那么,它会将这三个字节,按GBK编码来转换成字符串。
楼主可以查一下字符编码对照表,就可以了。
当然,我们知道GBK编码,当当前字节,其对应的数值小于128时,是与ACSII编码相同的。
由于LZ举得例子都满足上述条件,所以,只要查询ACSII字符编码对照表即可了。
因为,对应的不是我们经常看到的字符,所以显示出来比较怪异。
那个貌似很吓人的回答是对的,呵呵。
就是当:
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^)/~
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);
我又用这个试了下,发现打印出来的是:
貌似和您说的不一样呀!