字符大小是8位还是16位?

14

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html中提到,char类型的大小为16位,即2字节。但我记得它是8位,即1字节。为了澄清我的疑惑,我创建了一个包含单个字符 "a" 的文本文件并保存了它。然后我检查了文件的大小,结果是1字节即8位。我很困惑字符的实际大小是多少?如果是2字节,为什么文件大小只有1字节?如果是1字节,为什么链接中说是2字节?


一个字符是8位,也就是一个字节。 - Ali Gajani
13
这完全不真实。 - Jon Skeet
2
@AliGajani:再看一下语言标签,然后考虑Java中字符的编码方式。即便如此,8位不一定等于一个字节。 - Andon M. Coleman
2
是的,我意识到这是 Java。之前我错了。 - Ali Gajani
4个回答

41
在Java中,charUTF-16代码单元。它不一定是完整的Unicode字符,但实际上它是一个无符号16位整数。
当您将文本写入文件(或以其他方式将其转换为字节序列)时,数据将取决于您使用的编码。例如,如果您使用ASCII或ISO-8859-1,则可以编写的字符非常有限,但每个字符只有一个字节。如果您使用UTF-16,则每个Java char将被转换为正好两个字节-但某些Unicode字符可能需要四个字节(由两个Java char值表示)。
如果您使用UTF-8,则即使是单个Java char的编码形式的长度也会取决于其值。

c1是一个字节吗,c2是两个字节吗? char c1 = (char) 255; char c2 = (char) 258; - Pingpong
@Pingpong:不,char是一个16位数据类型,无论值为何,就像int是一个32位数据类型,无论值为何。 - Jon Skeet

8

学习计算机存储容量大小的一种现代方法是,只需使用BYTES进行打印。

System.out.println(Character.BYTES);

它的结果是2

0
请注意,文本文件实际上有与之相关联的格式/字符集。文本文件通常会以UTF-8格式保存,每个字符占用8位,除非该字符是“特殊字符”。

你对“特殊”的定义是什么?是指任何非ASCII字符吗? - Jon Skeet
我试图让我的回答简洁 :-) 完整的定义请参见Wikipedia - vogomatix
5
当“简洁”一词使用如此模糊的术语“特殊字符”时,我认为它没有多大用处。 - Jon Skeet

0
在Java中,char类型占2个字节(因为有效值范围的建议)。但这并不意味着每个字符的表示都是2个字节长。例如,许多编码仅为每个字符保留1个字节(或对最常见的字符使用1个字节)。如果平台默认编码是诸如ISO-8859-1之类的1字节编码或可变长度编码(如UTF-8),则可以轻松将该1个字节转换为单个字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接