Java中字符串的字符编码是什么?
实际上,我对Java中字符串的编码感到困惑。我有几个问题。如果您知道答案,请帮助我: 1) 内存中Java字符串的本机编码是什么?当我写Java中字符串的字符编码是什么?,java,string,character-encoding,Java,String,Character Encoding,实际上,我对Java中字符串的编码感到困惑。我有几个问题。如果您知道答案,请帮助我: 1) 内存中Java字符串的本机编码是什么?当我写String a=“Hello”时,它将以哪种格式存储?由于Java是独立于机器的,我认为系统不会进行编码 2) 我在网上读到“UTF-16”是默认编码,但我感到困惑,因为当我写inta='c'时,我得到了ASCII表中字符的编号。那么ASCII和UTF-16是一样的吗 3) 我也不确定字符串在内存中的存储取决于什么:操作系统,语言 Java在内部将字符串存储为
String a=“Hello”
时,它将以哪种格式存储?由于Java是独立于机器的,我认为系统不会进行编码
2) 我在网上读到“UTF-16”是默认编码,但我感到困惑,因为当我写inta='c'
时,我得到了ASCII表中字符的编号。那么ASCII和UTF-16是一样的吗
3) 我也不确定字符串在内存中的存储取决于什么:操作系统,语言
inti='x'
测试,您将获得ASCII值。然而,UTF-16可以表示比ASCII多得多的字符虽然这不能回答你的问题,但值得注意的是。。。在java字节码(类文件)中,字符串存储在UTF-8中 编辑:感谢LoadMaster帮助我更正我的答案:) 1) 所有内部字符串处理都使用UTF-16进行 2) ASCII是UTF-16的子集 3) Java内部使用的是UTF-16。对于其余部分,这取决于您的位置,是的。1)字符串是对象,通常包含
char
数组和字符串的长度。字符数组通常实现为16位字的连续数组,每个字包含一个本机字节顺序的Unicode字符
2) 将字符值指定给整数可将16位Unicode字符代码转换为其等效整数。因此,
'c'
,即U+0063,变为0x0063
,或99
3) 由于每个字符串
都是一个对象,因此它包含除类成员以外的其他信息(例如,类描述符字、锁/信号量字等)
ADENDUM对象内容取决于JVM实现(它确定与每个对象相关联的固有开销)以及类的实际编码方式(即,某些库可能比其他库更高效) 示例
典型的实现将为每个对象实例分配两个字的开销(对于类描述符/指针和一个信号量/锁控制字);
String
对象还包含int
长度和char[]
数组引用。字符串的实际字符内容存储在第二个对象中,char[]
数组,该数组依次分配两个字,加上一个数组长度的字,再加上字符串所需的16位char
元素(加上创建字符串时留下的任何额外字符)
附录2只有在大多数情况下,一个字符表示一个Unicode字符的情况才是正确的。这意味着编码在2005年之前是正确的。但到目前为止,Unicode已经变得越来越大,字符串必须使用UTF-16编码——在Java
字符串中,单个Unicode字符可能使用两个char
s
查看Apache实现的实际源代码,例如:
,你应该考虑把这些问题分解成个别问题,因为它们确实非常不同。这里可能可以回答2:字符串作为char[]
存储在内存中,每个元素包含一个16位UTF-16 Unicode字符。UTF-8不用于在内部存储字符串,但用于将I/O流转换为字符串或从字符串转换为字符串。@LoadMaster:在这段时间内它是否发生了更改?Java总是在内部使用UTF-16?是的,String
总是使用内部char[]
来存储其字符值。@Loadmaster我相信这是一个有用的信息,并且我明确提到它是类文件-那么你的问题是什么?但它没有回答问题。您可以将其作为评论发布,并以类似“虽然这不能回答您的问题,但值得注意的是……”的开头。这确实是一条有用的信息,不过,我不知道他们使用了UTF-8。重点是什么?这意味着JVM必须在启动时将每个字符串转换为UTF-16。@Sergey Tachenov:字符串存储为UTF-8,这样.class文件(平均)就更小了。当您像通常那样将它们放在JAR文件中时,这一点都不重要。UTF-16的压缩效率几乎是原来的两倍。@Parser:Oracel的文档对“编码:设置源文件编码名称,如EUC-JP和UTF-8”的要求非常严格,所以这只是源文件(*.java)编码,*.class文件中字符串的编码保留了UTF-8。实际上,您想说什么。它包含其他信息,因此??“将字符值赋给整数会将16位Unicode字符代码转换为其等效整数。”这里有点令人困惑的是,Unicode编码在前256个字符上与ASCII编码一致。Unicode与前256个字符的扩展ASCII(8位)相关;扩展ASCII则直接对应于前128位的7位ASCII。所以“c”在Unicode中编码为0x63,扩展