java char占几个字节

奇允 2013-04-14 06:32:30
一直认为java的char占2个字节,
FileWriter的write (int c)函数一直认为输出两个字节;
但今天测了下,结果和我想的不一样;

FileWriter fw =new FileWriter("test.txt");
char c1 ='你';
char c2='1';
int i=1;
fw.write(c1);
fw.write(c2);
fw.write(i);
fw.close();

输出我发现只有中文的占两个字节,其他输出都只有一个字节;好奇怪啊;
我的平台是xp 32位
...全文
5078 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
奇允 2013-04-16
  • 打赏
  • 举报
回复
谢谢各位慷慨热情的回复!
pangjingji 2013-04-16
  • 打赏
  • 举报
回复
Java中的char用的是utf-16编码方案编码,如果是基本多语言级别的字符,用一个代码单元进行编码即可,一个代码单元是16位(2字节)。如果字符在附加的16个多语言级别中,字符的编码是两个代码单元,是4字节。可以百度一下utf-16编码方案。Java core中写的比较详细,可以多读几遍就比较清楚了,刚开始读会比较费解。
dracularking 2013-04-15
  • 打赏
  • 举报
回复
引用 11 楼 zhaomeng1123 的回复:
引用 8 楼 fei1710 的回复:引用 7 楼 zhaomeng1123 的回复:引用 6 楼 fei1710 的回复:引用 4 楼 zhaomeng1123 的回复:引用 2 楼 fei1710 的回复:java内存中char是两个字节,但是保存到文件中时另一回事,取决于文件的字符编码。 write(int c)函数api说是输出整形的底16位,我想那输出一定是两……
输出2字节没错,关键检验的步骤是怎么怎么检验的,是不是写好以后再查几字节的,这样未必准了,中间可以经过转换
摆烂办不到 2013-04-15
  • 打赏
  • 举报
回复
System.out.println(new char('x').SIZE); 输出结果是16 也就是两个字节
奇允 2013-04-15
  • 打赏
  • 举报
回复
引用 13 楼 preferme 的回复:
字符与二进制之间是有对应关系的。这个转换过程叫编码,逆过程叫解码。 Java语言,字符在内存中采用的是Unicode双字节定长编码。 但是,你要是输出到文件中,就会存在一个编码转换的过程。 一般WinXP系统,简体中文版的默认编码是GB2312编码,而不是Unicode编码, 并且,你在使用FileWriter对象的时候,并没有指定具体的编码,那么默认编码就是操作系统的默认编码。 所以,……
好像是明白一点了,但与API上说明比起来,还是感觉有点牵强。那就是API写法有问题。
liubing303 2013-04-15
  • 打赏
  • 举报
回复
java中占两个字节,C中占一个字节
tianma630 2013-04-15
  • 打赏
  • 举报
回复
一个英文字符占一个字节 一个中文占2个字节
冰思雨 2013-04-15
  • 打赏
  • 举报
回复
字符与二进制之间是有对应关系的。这个转换过程叫编码,逆过程叫解码。 Java语言,字符在内存中采用的是Unicode双字节定长编码。 但是,你要是输出到文件中,就会存在一个编码转换的过程。 一般WinXP系统,简体中文版的默认编码是GB2312编码,而不是Unicode编码, 并且,你在使用FileWriter对象的时候,并没有指定具体的编码,那么默认编码就是操作系统的默认编码。 所以,文件中的字符,采用的是GB2312编码,汉字占2个字节,ASCII字符占1个字节。
gloomyfish 2013-04-15
  • 打赏
  • 举报
回复
JAVA中是两个字节,其它语言多数应该是1个字节
Ada168855 2013-04-15
  • 打赏
  • 举报
回复
引用 14 楼 tianma630 的回复:
一个英文字符占一个字节 一个中文占2个字节
+++
奇允 2013-04-15
  • 打赏
  • 举报
回复
引用 8 楼 fei1710 的回复:
引用 7 楼 zhaomeng1123 的回复:引用 6 楼 fei1710 的回复:引用 4 楼 zhaomeng1123 的回复:引用 2 楼 fei1710 的回复:java内存中char是两个字节,但是保存到文件中时另一回事,取决于文件的字符编码。
write(int c)函数api说是输出整形的底16位,我想那输出一定是两个字节呀,和文件的编码应该没有什么关系……


public void write(int c)
throws IOExceptionWrites a single character. The character to be written is contained in the 16 low-order bits of the given integer value; the 16 high-order bits are ignored.

//函数说明是写入低16位,意思不就是输出两个字节吗?但我write(1)时,只有一个字节。


而我期望的是两个字节,也就是说输出的16进制为00 01
fei1710 2013-04-15
  • 打赏
  • 举报
回复
fw.write(1); 等价于 char ch = 1; fw.write(ch); 这样应该明白了吧
gzqfeng123 2013-04-15
  • 打赏
  • 举报
回复
引用 20 楼 k_scott 的回复:
2 bit
2 byte..
Zh_java_2009 2013-04-15
  • 打赏
  • 举报
回复
这。。。没有研究过,学习了
十年彩虹 2013-04-15
  • 打赏
  • 举报
回复
2 bit
A_BuN 2013-04-15
  • 打赏
  • 举报
回复
Java的char支持Unicode编码(是用16位来存储的),你可以给它一个汉字(两个字节),也可以给它赋值一个数值,但是你输出的是这个变量的值,和它用多少字节来存储没有关系。
yongtaimen 2013-04-15
  • 打赏
  • 举报
回复
JAVA的输入输出流类继承自:InputStream/OutputStream和Reader/Writer,前者用于位传输,以字节(Bytes)为传输单位;后者以字符(Character)为传输单位,适用于以Unicode编码的文字(如中文等亚洲语系)。 System.out.println(c); 使用的就是InputStream。 java的String使用Unicode,一个字符是两个字节的,而UTF-8则是采用1-3个字节 。
sxax 2013-04-14
  • 打赏
  • 举报
回复
JAVA中是占用2个字节
fei1710 2013-04-14
  • 打赏
  • 举报
回复
引用 7 楼 zhaomeng1123 的回复:
引用 6 楼 fei1710 的回复:引用 4 楼 zhaomeng1123 的回复:引用 2 楼 fei1710 的回复:java内存中char是两个字节,但是保存到文件中时另一回事,取决于文件的字符编码。 write(int c)函数api说是输出整形的底16位,我想那输出一定是两个字节呀,和文件的编码应该没有什么关系吧。 FileWriter这个类是面向字符的,……

    /**
     * Writes a single character.
     *
     * @exception  IOException  If an I/O error occurs
     */
    public void write(int c) throws IOException {
        se.write(c);
    }
上面写着是写入一个字符。难道我的jdk跟你的不一样?
奇允 2013-04-14
  • 打赏
  • 举报
回复
引用 6 楼 fei1710 的回复:
引用 4 楼 zhaomeng1123 的回复:引用 2 楼 fei1710 的回复:java内存中char是两个字节,但是保存到文件中时另一回事,取决于文件的字符编码。 write(int c)函数api说是输出整形的底16位,我想那输出一定是两个字节呀,和文件的编码应该没有什么关系吧。 FileWriter这个类是面向字符的,并不是二进制字节。另外windows中……
我还是不明白输出的为什么是1个字节,write(int c)的api说明明明是输出低16位,也就是两个字节,到底在说明地方给去掉一个了呢?
加载更多回复(6)

62,614

社区成员

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

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