Java char类型是否保证以任何特定编码存储?
编辑:我错误地说了这个问题。我要问的是保证使用任何特定编码的字面文字吗?
答案 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中用作较大字符的扩展表示的一部分。