在什么编码中存储了Java char?

时间:2011-08-11 00:23:25

标签: java unicode character-encoding

Java char类型是否保证以任何特定编码存储?

编辑:我错误地说了这个问题。我要问的是保证使用任何特定编码的字面文字吗?

3 个答案:

答案 0 :(得分:15)

“存储”在哪里? Java中的所有字符串都是represented in UTF-16。当写入文件,通过网络发送或其他任何内容时,它将使用您指定的任何字符编码发送。

修改:特别针对char类型,请参阅Character docs。具体来说:“char数据类型...基于原始的Unicode规范,它将字符定义为固定宽度的16位实体。”因此,如果 char实际上包含来自该字符集的字符,那么将int转换为char将始终为您提供UTF-16值。如果您只是在char中添加了一些随机值,它显然不一定是有效的UTF-16字符,同样如果您使用错误的编码读取该字符。文档继续讨论补充UTF-16字符如何只能由int表示,因为char没有足够的空间来容纳它们,并且如果你在这个级别上运行,熟悉那些语义可能很重要。

答案 1 :(得分:6)

Java char通常用于保存Unicode code unit;即16位单元,它是有效UTF-16序列的一部分。但是,没有什么可以阻止应用程序将任何16位无符号值放入char,无论它实际意味着什么。

所以你可以说一个Unicode代码单元可以由<{1}}表示,而char 可以代表一个Unicode代码单元。 ..但在一般情况下,这些都不是必然是真的。

关于如何存储Java char的问题无法解答。简单地说,这取决于你所说的“存储”:

  • 如果您的意思是“在执行程序中表示”,那么答案就是特定于JVM实现。 (char数据类型通常表示为16位机器整数,但它可能是机器字对齐,也可能不是机器字对齐,具体取决于具体的上下文。)

  • 如果您的意思是“存储在文件中”或类似的东西,那么答案就是完全依赖应用程序选择如何存储它。


  

Java char类型是否保证以任何特定编码存储?

根据我上面所说的,答案是“不”。在正在执行的应用程序中,由应用程序决定char的含义/包含内容。当char存储到文件中时,应用程序会决定它如何存储它以及它将使用的磁盘表示形式。


<强>后续

  

char文字怎么样?例如,'c'必须具有由语言定义的某个值。

这取决于字符文字形式,以及字符是什么。例如,对于小写的“c”,“c”将具有Unicode代码点的底部16位的值。但是表示为'\ uxxxx'的文字可能不代表有效的Unicode代码点。或者(取决于应用程序的含义)它可能根本不代表一个角色。

源代码文件的编码也使(可能)复杂化。理论上可以用自定义字符编码表示源代码,其中(为了参数)大写字母被编码为小写,反之亦然。如果你这样做了,并且你能够在启动编译器之前注册相应的Charset编码器和解码器,那么看起来像char的文字(将输入视为ASCII或UTF-8)实际上将具有值{ {1}}在编译器程序中而不是'c'

答案 2 :(得分:2)

最初,Java在内部使用UCS-2;现在它使用UTF-16。除了D800 - DFFF之外,两者几乎相同,它们在UTF-16中用作较大字符的扩展表示的一部分。