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

linus_liu2000 2009-08-09 10:28:51
我在一本书上说java的字符是unicode码,每个字符占两个字符.不知对不对.又有人说在键盘输入的字符是要经过GBK编码的,把每个英文字母编成一个字节了,我做了个小测试
inputstream中有一个函数是read(),书上说它一次只能读取一个字节的内容。但得的结果:
system.out.println(system.in.read());
如果我在键盘上敲击A,会输出65,也就是字母A的asc2表的代号。
如果一个字母是占两个字节的,而read一次只能读一个字节,那末为何在这里read()一次就可以把A全部读入了?难道GBK编码的字符,英文占一个字符,中文占两个字符?
...全文
1817 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyun5d 2009-08-10
  • 打赏
  • 举报
回复
内部表示是unicode。但是楼主的例子不合适。输入输入的表示是和系统相关的(汇编语言最清晰),最原始的看法一切都是字节流只是你的解释不同则不同了。楼主的例子可以这样来:
try{
int i ;
i = System.in.read();
char ii;
ii = (char)i;
System.out.print(i);
}catch(Exception e)
{}

在ii处设断点,可以使用调试工具看编为"\u0041".呵呵.多一些思考就好了.事物不是一成不变的,Java中字符编都是转来转去的.可以在google中搜一下.
紫炎圣骑 2009-08-10
  • 打赏
  • 举报
回复
unicode一定是2个字节
UTF-8是1到3个字节不确定
zombiehack 2009-08-10
  • 打赏
  • 举报
回复
java的字符是unicode编码 unicode英文字符占1个1个字节 汉字占2个字节
huxj62488 2009-08-10
  • 打赏
  • 举报
回复
一般是双字节
byxiaolin1987 2009-08-10
  • 打赏
  • 举报
回复
占两个字节
linus_liu2000 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tiger861221 的回复:]
中文字符占两个字节。为什么read()读入一个字节就能把A全读入的原因:我们知道ASCII码是八位的,A在ASCII码中有相应的码对应,也就是说A只要八位就能表示了,但是unicode是支持ASCII码的,所以在unicode中表示A的时候是用第八位的ASCII码补上高八位0,read()读入一个字节的时候已经读入了A的ASCII码了,打印的时候会给其高8位补上0的,所以能正常显示A。
[/Quote]
这位的意思是不是说字符"A"在数据流中还是占8位字符,这样read()一次就能把这8位全都读出了,但在显示时,会自动给前边再补8位0,以凑成16位,我这样理解对吗?
linda724 2009-08-10
  • 打赏
  • 举报
回复
2个字节,在各种平台上都一样。这也java跨平台的保证之一
蓝--天 2009-08-10
  • 打赏
  • 举报
回复
2个字符,可以通过汉字字符串的长度判断。
zhang_yu_QIN 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 blliy117 的回复:]
Java codeint c='王';
System.out.println(c);//打印出来的结果是 29579这个对应的二进制是 111001110001011//如果是A的话打印出来的是 65 对应的是 1000001//显然Uncode编码不代表每个字都占两个字节。
[/Quote]

正解..
jeiwt 2009-08-10
  • 打赏
  • 举报
回复
占两个字节
jjqxt 2009-08-10
  • 打赏
  • 举报
回复
怎么不确定了?我A是1个 “字”是3个 不懂?有人解释下么?
muyangk 2009-08-09
  • 打赏
  • 举报
回复
可以这么说,unicode,gbk都是双字节的,用read读它会自动识别,当读入像英文这样的可以用一个字节表示的时候,它会自动在高位补0
blliy117 2009-08-09
  • 打赏
  • 举报
回复


int c = '王';
System.out.println(c);
//打印出来的结果是 29579这个对应的二进制是 111001110001011
//如果是A的话打印出来的是 65 对应的是 1000001
//显然Uncode编码不代表每个字都占两个字节。
blliy117 2009-08-09
  • 打赏
  • 举报
回复
当然不对

一个字符要看什么字符
一个ascii (0-255)可以用8位二进制表示所以只占一个字节
超过0-255范围就要用二个字节因为8位二进制不够表示了
anonymsean 2009-08-09
  • 打赏
  • 举报
回复
在字符输出过程中,有unicode向本地系统字符集转换的过程.
GBK也是双字节编码的.在JAVA中输入一个chat类型,它是占两字节的.
inputstream中的函数read(),一次只读取一个字节,但是它还是会变成32位的,只要在它的高位补0,凑成32位就可以了.
zhangyong20081204 2009-08-09
  • 打赏
  • 举报
回复
是要仔细研究下。。
jinxfei 2009-08-09
  • 打赏
  • 举报
回复
I/O和内部编码是两码事儿。
closewbq 2009-08-09
  • 打赏
  • 举报
回复
System.in.read() 返回的是输入数值的 ASKII 码(一个 int 整数)。
如果要求输入输出的一致的话:
通常情况下,你会用readLine( )一行一行地读取输入,因此要把System.in包装成BufferedReader。但在这之前还得先用InputSteamReader把System.in转换成Reader。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
老张-AI 2009-08-09
  • 打赏
  • 举报
回复
2个字节
kingteng 2009-08-09
  • 打赏
  • 举报
回复
你输入一个中文也是出来一个int范围的数字啊,因为read的返回值是int的,只在那个很小的范围,是把2个字节给截断到一个字节了吧
加载更多回复(9)

62,634

社区成员

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

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