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

pep*_*psi 11 java unicode character-encoding

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

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

Rya*_*art 16

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

编辑:专门针对该char类型,请参阅角色文档.具体来说:"char数据类型...基于原始的Unicode规范,它将字符定义为固定宽度的16位实体." 因此,铸造charint永远给你一个UTF-16的值,如果char实际包含从字符集的字符.如果你只是戳了一些随机值char,它显然不一定是有效的UTF-16字符,同样如果你使用错误的编码读取字符.文档继续讨论补充UTF-16字符如何只能由a表示int,因为char没有足够的空间来容纳它们,如果你在这个级别上运行,那么熟悉这些字符可能很重要语义.


Ste*_*n C 6

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

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

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

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

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


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

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


跟进

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

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

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


Ern*_*ill 5

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