inputstream中有一个函数是read(),书上说它一次只能读取一个字节的内容。但得的结果:
system.out.println(system.in.read());
如果我在键盘上敲击A,会输出65,也就是字母A的asc2表的代号。
如果一个字母是占两个字节的,而read一次只能读一个字节,那末为何在这里read()一次就可以把A全部读入了?难道GBK编码的字符,英文占一个字符,中文占两个字符?
29 个解决方案
#1
帮顶,求分.
#2
中文字符占两个字节。为什么read()读入一个字节就能把A全读入的原因:我们知道ASCII码是八位的,A在ASCII码中有相应的码对应,也就是说A只要八位就能表示了,但是unicode是支持ASCII码的,所以在unicode中表示A的时候是用第八位的ASCII码补上高八位0,read()读入一个字节的时候已经读入了A的ASCII码了,打印的时候会给其高8位补上0的,所以能正常显示A。
#3
Java 中的字符本身没有这个概念。但是将字符转换成字节时,组要指定编码。不同的编码会得到不同长度的字节串。
#4
学习
#5
你输入一个中文也是出来一个int范围的数字啊,因为read的返回值是int的,只在那个很小的范围,是把2个字节给截断到一个字节了吧
#6
2个字节
#7
System.in.read() 返回的是输入数值的 ASKII 码(一个 int 整数)。
如果要求输入输出的一致的话:
通常情况下,你会用readLine( )一行一行地读取输入,因此要把System.in包装成BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
如果要求输入输出的一致的话:
通常情况下,你会用readLine( )一行一行地读取输入,因此要把System.in包装成BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
#8
I/O和内部编码是两码事儿。
#9
是要仔细研究下。。
#10
在字符输出过程中,有unicode向本地系统字符集转换的过程.
GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.
GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.
#11
当然不对
一个字符要看什么字符
一个ascii (0-255)可以用8位二进制表示所以只占一个字节
超过0-255范围就要用二个字节因为8位二进制不够表示了
、
一个字符要看什么字符
一个ascii (0-255)可以用8位二进制表示所以只占一个字节
超过0-255范围就要用二个字节因为8位二进制不够表示了
、
#12
int c = '王';
System.out.println(c);
//打印出来的结果是 29579这个对应的二进制是 111001110001011
//如果是A的话打印出来的是 65 对应的是 1000001
//显然Uncode编码不代表每个字都占两个字节。
#13
可以这么说,unicode,gbk都是双字节的,用read读它会自动识别,当读入像英文这样的可以用一个字节表示的时候,它会自动在高位补0
#14
unicode 就是一个字符占两个字节
如果是英文字符 高位自动补0的
如果能看懂
windows API MutilByteToWiderChar 就知道了
如果是英文字符 高位自动补0的
如果能看懂
windows API MutilByteToWiderChar 就知道了
#15
这个和具体你java源文件编码有关。
比如你java源程序设定的编码是gbk,那么一个汉字字符2个字节,如果是utf-8,则是3个字节
比如你java源程序设定的编码是gbk,那么一个汉字字符2个字节,如果是utf-8,则是3个字节
#16
看得不是很懂。。
#17
public class fd {
public fd() {
String string1 = "aaa";
String string2 = "字字字";
System.out.println(string1.getBytes().length);
System.out.println(string2.getBytes().length);
}
public static void main(String[] args) {
new fd();
}
}
这个运行后是3 和 9
我用的是utf-8编码 你可以自己试试换个编码
#18
FYI:
UTF非固定字节编码,1到3个字节不等
UTF非固定字节编码,1到3个字节不等
#19
2个字节,在各种平台上都一样。这也java跨平台的保证之一
#20
这位的意思是不是说字符"A"在数据流中还是占8位字符,这样read()一次就能把这8位全都读出了,但在显示时,会自动给前边再补8位0,以凑成16位,我这样理解对吗?
#21
占两个字节
#22
一般是双字节
#23
unicode一定是2个字节
UTF-8是1到3个字节不确定
UTF-8是1到3个字节不确定
#24
怎么不确定了?我A是1个 “字”是3个 不懂?有人解释下么?
#25
占两个字节
#26
正解..
#27
2个字符,可以通过汉字字符串的长度判断。
#28
java的字符是unicode编码 unicode英文字符占1个1个字节 汉字占2个字节
#29
内部表示是unicode。但是楼主的例子不合适。输入输入的表示是和系统相关的(汇编语言最清晰),最原始的看法一切都是字节流只是你的解释不同则不同了。楼主的例子可以这样来:
try{
int i ;
i = System.in.read();
char ii;
ii = (char)i;
System.out.print(i);
}catch(Exception e)
{}
在ii处设断点,可以使用调试工具看编为"\u0041".呵呵.多一些思考就好了.事物不是一成不变的,Java中字符编都是转来转去的.可以在google中搜一下.
try{
int i ;
i = System.in.read();
char ii;
ii = (char)i;
System.out.print(i);
}catch(Exception e)
{}
在ii处设断点,可以使用调试工具看编为"\u0041".呵呵.多一些思考就好了.事物不是一成不变的,Java中字符编都是转来转去的.可以在google中搜一下.
#1
帮顶,求分.
#2
中文字符占两个字节。为什么read()读入一个字节就能把A全读入的原因:我们知道ASCII码是八位的,A在ASCII码中有相应的码对应,也就是说A只要八位就能表示了,但是unicode是支持ASCII码的,所以在unicode中表示A的时候是用第八位的ASCII码补上高八位0,read()读入一个字节的时候已经读入了A的ASCII码了,打印的时候会给其高8位补上0的,所以能正常显示A。
#3
Java 中的字符本身没有这个概念。但是将字符转换成字节时,组要指定编码。不同的编码会得到不同长度的字节串。
#4
学习
#5
你输入一个中文也是出来一个int范围的数字啊,因为read的返回值是int的,只在那个很小的范围,是把2个字节给截断到一个字节了吧
#6
2个字节
#7
System.in.read() 返回的是输入数值的 ASKII 码(一个 int 整数)。
如果要求输入输出的一致的话:
通常情况下,你会用readLine( )一行一行地读取输入,因此要把System.in包装成BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
如果要求输入输出的一致的话:
通常情况下,你会用readLine( )一行一行地读取输入,因此要把System.in包装成BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
#8
I/O和内部编码是两码事儿。
#9
是要仔细研究下。。
#10
在字符输出过程中,有unicode向本地系统字符集转换的过程.
GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.
GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.
#11
当然不对
一个字符要看什么字符
一个ascii (0-255)可以用8位二进制表示所以只占一个字节
超过0-255范围就要用二个字节因为8位二进制不够表示了
、
一个字符要看什么字符
一个ascii (0-255)可以用8位二进制表示所以只占一个字节
超过0-255范围就要用二个字节因为8位二进制不够表示了
、
#12
int c = '王';
System.out.println(c);
//打印出来的结果是 29579这个对应的二进制是 111001110001011
//如果是A的话打印出来的是 65 对应的是 1000001
//显然Uncode编码不代表每个字都占两个字节。
#13
可以这么说,unicode,gbk都是双字节的,用read读它会自动识别,当读入像英文这样的可以用一个字节表示的时候,它会自动在高位补0
#14
unicode 就是一个字符占两个字节
如果是英文字符 高位自动补0的
如果能看懂
windows API MutilByteToWiderChar 就知道了
如果是英文字符 高位自动补0的
如果能看懂
windows API MutilByteToWiderChar 就知道了
#15
这个和具体你java源文件编码有关。
比如你java源程序设定的编码是gbk,那么一个汉字字符2个字节,如果是utf-8,则是3个字节
比如你java源程序设定的编码是gbk,那么一个汉字字符2个字节,如果是utf-8,则是3个字节
#16
看得不是很懂。。
#17
public class fd {
public fd() {
String string1 = "aaa";
String string2 = "字字字";
System.out.println(string1.getBytes().length);
System.out.println(string2.getBytes().length);
}
public static void main(String[] args) {
new fd();
}
}
这个运行后是3 和 9
我用的是utf-8编码 你可以自己试试换个编码
#18
FYI:
UTF非固定字节编码,1到3个字节不等
UTF非固定字节编码,1到3个字节不等
#19
2个字节,在各种平台上都一样。这也java跨平台的保证之一
#20
这位的意思是不是说字符"A"在数据流中还是占8位字符,这样read()一次就能把这8位全都读出了,但在显示时,会自动给前边再补8位0,以凑成16位,我这样理解对吗?
#21
占两个字节
#22
一般是双字节
#23
unicode一定是2个字节
UTF-8是1到3个字节不确定
UTF-8是1到3个字节不确定
#24
怎么不确定了?我A是1个 “字”是3个 不懂?有人解释下么?
#25
占两个字节
#26
正解..
#27
2个字符,可以通过汉字字符串的长度判断。
#28
java的字符是unicode编码 unicode英文字符占1个1个字节 汉字占2个字节
#29
内部表示是unicode。但是楼主的例子不合适。输入输入的表示是和系统相关的(汇编语言最清晰),最原始的看法一切都是字节流只是你的解释不同则不同了。楼主的例子可以这样来:
try{
int i ;
i = System.in.read();
char ii;
ii = (char)i;
System.out.print(i);
}catch(Exception e)
{}
在ii处设断点,可以使用调试工具看编为"\u0041".呵呵.多一些思考就好了.事物不是一成不变的,Java中字符编都是转来转去的.可以在google中搜一下.
try{
int i ;
i = System.in.read();
char ii;
ii = (char)i;
System.out.print(i);
}catch(Exception e)
{}
在ii处设断点,可以使用调试工具看编为"\u0041".呵呵.多一些思考就好了.事物不是一成不变的,Java中字符编都是转来转去的.可以在google中搜一下.