Java中String的字符编码是什么?

时间:2010-12-15 18:00:37

标签: java string character-encoding

我对Java中字符串的编码感到困惑。我有一些问题。如果您知道答案,请帮助我:

1)内存中Java字符串的本机编码是什么?当我写String a = "Hello"时,它将以哪种格式存储?由于Java与机器无关,我认为系统不会进行编码。

2)我在网上读到“UTF-16”是默认编码,但我感到困惑,因为当我写int a = 'c'时,我得到了ASCII表中字符的编号。那么ASCII和UTF-16是一样的吗?

3)另外,我不确定内存中字符串的存储依赖于什么:操作系统,语言?

4 个答案:

答案 0 :(得分:36)

  1. Java在内部将字符串存储为UTF-16。

  2. “默认编码”不太正确。 Java在内部将字符串存储为UTF-16,但外部使用的编码“系统默认编码”因平台而异,甚至可能会被某些平台上的环境变量等更改。

    ASCII是Latin 1的子集,它是Unicode的子集。 UTF-16是一种编码Unicode的方法。因此,如果对任何属于ASCII范围的字符执行int i = 'x'测试,您将获得ASCII值。但是,UTF-16可以表示比ASCII更多的字符。

  3. 来自java.lang.Character docs

      

    Java 2平台在char数组和String和StringBuffer类中使用UTF-16表示。

    因此,它被定义为Java 2平台的一部分,UTF-16用于这些类。

答案 1 :(得分:19)

1)字符串是对象,通常包含char数组和字符串的长度。字符数组通常实现为16位字的连续数组,每个字包含本机字节顺序的Unicode字符。

2)将字符值分配给整数会将16位Unicode字符代码转换为等效的整数。因此,'c',即U + 0063,变为0x0063或99。

3)由于每个String都是一个对象,它包含除其类成员之外的其他信息(例如,类描述符字,锁/信号量字等)。

<强> ADENDUM
对象内容取决于JVM实现(确定与每个对象相关的固有开销),以及类实际编码的方式(即,某些库可能比其他库更有效)。

示例
典型的实现将为每个对象实例分配两个字的开销(对于类描述符/指针和信号量/锁控制字); String对象还包含int长度和char[]数组引用。字符串的实际字符内容存储在第二个对象char[]数组中,该数组又分配了两个字,加上一个数组长度字,以及根据需要添加的多个16位char元素对于字符串(加上创建字符串时留下的任何额外字符)。

ADDENDUM 2
one char表示一个 Unicode字符的情况仅在大多数情况下才为真。这将意味着UCS-2编码并且在2005之前是真的。但是现在Unicode变得更大并且字符串必须使用UTF-16编码 - 其中一个Unicode字符可以使用两个 { {1}}在Java char中。

查看Apache实现的实际源代码,例如: at:
http://www.docjar.com/html/api/java/lang/String.java.html

答案 2 :(得分:4)

虽然这不能回答你的问题,但值得注意的是......在java字节代码(类文件)中,字符串以UTF-8存储。 http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

答案 3 :(得分:1)

编辑:感谢LoadMaster帮助我纠正我的回答:)

1)所有内部字符串处理都以UTF-16进行。

2)ASCII是UTF-16的子集。

3)Java内部是UTF-16。其余的,取决于你的位置,是的。