public class hello { /**
* @param args
*/
public static void main(String[] args)
{ byte[]b=new byte[]{1,2,3};
String str=new String(b,0,2);
System.out.println(str);
}
}
怎么打印出两个口口而不是123啊
该怎么解决啊!
并说明理由如果byte[]b=new byte[]{1,2,3}改为byte[]b=new byte[]{'1','2','3'};怎么就打印出来了!
别人说什么你这是拿数字转字符~,还有byte 数组转换字符串就是这样的~字符编码的问题
我一点也不明明白!请能给我讲清楚些吗?谢谢!转化过程是怎样的啊!编码什么什么的讲清楚些!谢谢了!!
谢谢了!!
谢谢了!!
* @param args
*/
public static void main(String[] args)
{ byte[]b=new byte[]{1,2,3};
String str=new String(b,0,2);
System.out.println(str);
}
}
怎么打印出两个口口而不是123啊
该怎么解决啊!
并说明理由如果byte[]b=new byte[]{1,2,3}改为byte[]b=new byte[]{'1','2','3'};怎么就打印出来了!
别人说什么你这是拿数字转字符~,还有byte 数组转换字符串就是这样的~字符编码的问题
我一点也不明明白!请能给我讲清楚些吗?谢谢!转化过程是怎样的啊!编码什么什么的讲清楚些!谢谢了!!
谢谢了!!
谢谢了!!
* @param args
*/
public static void main(String[] args)
{ byte[]b=new byte[]{49,50,51};
String str=new String(b,0,2); System.out.println(str); }
} 看看
'1'-->49
'2'-->50
'3'-->51是否想起了些什么?
Asc码表的前面几个是非打印字符
String str=new String(b,0,2);
System.out.println(str);
int hibyte,
int offset,
int count)
Deprecated. This method does not properly convert bytes into characters.
int offset,
int length)
Constructs a new String by decoding the specified subarray of bytes using the platform's default charset. The length of the new String is a function of the charset, and hence may not be equal to the length of the subarray.
Sorry! 9# is not correct.
楼主上网搜索一下ACSII码表,里面会有相应的值的。Java中字符是采用Unicode编码的,数字和字符的Unicode编码,与,ACSII编码是重合的。
所以,如果只是数字和字母的问题,查ASCII码对照表,就可以搞定了。
如果是中文,或者别的什么文,那就比较麻烦了。
还是....?讲清楚些,想知道转化原理.谢谢了!!
还是....?讲清楚些,想知道转化原理.谢谢了!!
1,2,3 整型数字把整型数字附值给字节数组,数字被解析为ASCII码附值;
当你转为字符串输出时,输出为ASCII码,上面有人说不能显示,可能是这个原因吧。
而加了单引号就是自动类型转换为char类型的了,所以打印出来的是123
比较郁闷,因为,比较基础。我们都知道,计算机,只认识01的二进制数。(对于程序员,一般,会把01的二进制数,转换成十六进制数来相互沟通。
因为,4位二进制数,刚好可以表示一位十六进制数,任何一位十六进制数也可以转换为4位二进制数。)
那么,我们要处理字符的时候,怎么办?
只有把所知的字符,用数字来表示。这就是编码过程。早期的英文字符编码,流行的有3种,最为常用的就是ASCII编码,好象叫做 美国标准信息交换代码,
其实,就是一个数值和字符的对照表,给楼主个地址,可以去查查看http://www.96yx.com/tool/ASC2.htm
这个对照表里面不仅有26个大小写的英文字符,也有一些特殊字符,还有0~9这十个数字字符(也就是说,这里面的数字,按字符处理),
我们知道,这种编码规则,有一个特点,就是,每个字符,用一个字节就可以表示,并且,只用一个字节的7个比特就可以完全表示了。
(最高位的比特不用,是为了以后让这种编码具有可扩充性,GBK就是基于ASCII编码扩充出来的)回到Java
Java当中,所有的字符,都是以Unicode的形式,进行编码的。
Unicode编码,也有个特点,就是,所有的编码字符,都占2个字节(ASCII码占一个字节),
并且,如果把Unicode编码的数值,按从小到大进行排列的话,前128个编码字符,与ASCII编码相同。
换句话说,就是,如果把Unicode编码当中,高位字节是0x00的,并且低位字节最高位bit为0的,字符拿出来,
与ASCII表进行对比,如果把Unicode的高位字节去掉,就与ASCII编码相同了。回到程序
楼主应该去看看Java程序的常量表示。
普通的数字0~9(比如int i=1中的1),会被默认为int型数据。
如果你想让计算机识别成字符型(char型)的常量,那么应该用单引号将数字引起来,表示一个字符(比如char j='1'中的'1' )
如果你声明变量是这种情况byte a='1';那么,系统会把字符型数据'1'它的高位字节0x00舍弃,把低位字节的内容存放到a中,
那么,a的数值应该是49,十六进制是0x31,ASCII编码后的字符应该是'1'。谈谈String
String对象的构造器有很多种,其中,楼主所使用的String(byte[] bytes, int offset, int length)这个构造器,
第一个参数,是待转换的字节数组。
在构造String对象的时候,传入的这个字节数组,会被解码。具体采用哪种编码方式进行解码,API说明是按照默认的编码方式进行解码的。
这个默认的编码方式,取决于你操作系统的设定,一般Windows中文版,都使用的是GBK。
如果默认的编码方式,无法正确进行解码,会再次尝试ASCII编码方式进行解码。我使用的操作系统是Windows XP 中文版,并且,默认的字符编码是GBK,
那么根据程序流程,会对第一个参数bytes用GBK进行解码,
由于GBK是从ASCII编码基础上扩充出来的,所以,完全能够将ASCII形式的bytes数据进行解码。解码成Unicode形式存储在内存中。
前面我回答楼主的回复,可能会误导楼主,在这里,郑重道歉。
总的来讲,就是,输入参数,是ASCII编码形式的数据,我们按照GBK编码的形式进行解码,解码后的数据,其实是Unicode编码的数据。容易混乱的ASCII与GBK
GBK对字符的编码,不是定长编码(Unicode是定长编码,就是说,所有的字符都是2个字节来表示),GBK对字符的编码,采用的是变长编码。
具体分两种情况:
1.对于ASCII表中存在的字符,采用ASCII编码(单字节)。
2.对于中文汉字,以双字节来表示,并且,双字节的每个字节的最高位为1
那么在解码的过程中,先判断一个字节的最高位是否为1,不为1则按ASCII编码来处理;
如果为1则看下一个字节的最高位是否为1,如果为1则将两个字节按GBK编码来处理;
下一个字节最高位不为1,则说明不是GBK编码的数据,是无法进行解码的。明白了上述内容,我们就会知道:
我们输入的参数是ASCII编码的数据,程序按系统默认的GBK进行解码,解码后的数据是以Unicode的编码形式存储在内存中的。
由于GBK是在ASCII上扩充出来的,所以,可以按GBK的编码方式对ASCII编码的数据进行解码。
由于Unicode编码中,高位字节是0x00,低位字节最高位为0的,128个字符与ASCII编码相同,
所以,在Unicode编码的所有字符中,ASCII编码中出现的字符,其数值的大小,在Unicode和ASCII中是相同的。汗~~~
一身汗~~!