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

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

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

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

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

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

所以你可以说Unicode代码单元可以用 char表示,而char 可以表示Unicode代码单元……但在一般情况下,这些都不一定都是正确的。

您无法回答有关如何存储Java char问题。 简单地说,这取决于“存储”的含义:

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

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


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

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


跟进

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

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

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

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