java 中字符是占两个字节还是一个字节

时间:2023-01-11 17:17:20
我在一本书上说java的字符是unicode码,每个字符占两个字符.不知对不对.又有人说在键盘输入的字符是要经过GBK编码的,把每个英文字母编成一个字节了,我做了个小测试
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));

#8


I/O和内部编码是两码事儿。

#9


是要仔细研究下。。

#10


在字符输出过程中,有unicode向本地系统字符集转换的过程.
GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.

#11


当然不对

一个字符要看什么字符
一个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 就知道了

#15


这个和具体你java源文件编码有关。
比如你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个字节不等

#19


2个字节,在各种平台上都一样。这也java跨平台的保证之一

#20


引用 2 楼 tiger861221 的回复:
中文字符占两个字节。为什么read()读入一个字节就能把A全读入的原因:我们知道ASCII码是八位的,A在ASCII码中有相应的码对应,也就是说A只要八位就能表示了,但是unicode是支持ASCII码的,所以在unicode中表示A的时候是用第八位的ASCII码补上高八位0,read()读入一个字节的时候已经读入了A的ASCII码了,打印的时候会给其高8位补上0的,所以能正常显示A。

这位的意思是不是说字符"A"在数据流中还是占8位字符,这样read()一次就能把这8位全都读出了,但在显示时,会自动给前边再补8位0,以凑成16位,我这样理解对吗?

#21


占两个字节

#22


一般是双字节

#23


unicode一定是2个字节
UTF-8是1到3个字节不确定

#24


怎么不确定了?我A是1个 “字”是3个 不懂?有人解释下么?

#25


占两个字节

#26


引用 12 楼 blliy117 的回复:
Java codeint c='王';
System.out.println(c);//打印出来的结果是    29579这个对应的二进制是  111001110001011//如果是A的话打印出来的是 65  对应的是  1000001//显然Uncode编码不代表每个字都占两个字节。


正解..

#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中搜一下.

#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));

#8


I/O和内部编码是两码事儿。

#9


是要仔细研究下。。

#10


在字符输出过程中,有unicode向本地系统字符集转换的过程.
GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.

#11


当然不对

一个字符要看什么字符
一个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 就知道了

#15


这个和具体你java源文件编码有关。
比如你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个字节不等

#19


2个字节,在各种平台上都一样。这也java跨平台的保证之一

#20


引用 2 楼 tiger861221 的回复:
中文字符占两个字节。为什么read()读入一个字节就能把A全读入的原因:我们知道ASCII码是八位的,A在ASCII码中有相应的码对应,也就是说A只要八位就能表示了,但是unicode是支持ASCII码的,所以在unicode中表示A的时候是用第八位的ASCII码补上高八位0,read()读入一个字节的时候已经读入了A的ASCII码了,打印的时候会给其高8位补上0的,所以能正常显示A。

这位的意思是不是说字符"A"在数据流中还是占8位字符,这样read()一次就能把这8位全都读出了,但在显示时,会自动给前边再补8位0,以凑成16位,我这样理解对吗?

#21


占两个字节

#22


一般是双字节

#23


unicode一定是2个字节
UTF-8是1到3个字节不确定

#24


怎么不确定了?我A是1个 “字”是3个 不懂?有人解释下么?

#25


占两个字节

#26


引用 12 楼 blliy117 的回复:
Java codeint c='王';
System.out.println(c);//打印出来的结果是    29579这个对应的二进制是  111001110001011//如果是A的话打印出来的是 65  对应的是  1000001//显然Uncode编码不代表每个字都占两个字节。


正解..

#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中搜一下.