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

45 java string character-encoding

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

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

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

3)我还不确定内存中字符串的存储取决于:操作系统,语言?

Lau*_*ves 38

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

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

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

  3. 来自java.lang.Character文档:

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

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

  • @HendyIrawan Jana不允许您访问单个字节,只访问字符(对应于UTF-16代码单元),因此没有设置字节序.内存中使用的实际endian依赖于JVM /平台,就像用于在内存中存储int的endian一样. (3认同)
  • UTF-16BE还是UTF-16LE? (2认同)

Dav*_*ble 21

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

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

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

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

示例
典型的实现将为每个对象实例分配两个字的开销(对于类描述符/指针和信号量/锁控制字); 一个String对象还包含一个int长度和一个char[]阵列基准.字符串的实际字符内容存储在第二个对象中,该char[]数组又分配了两个字,加上一个数组长度字,加上char字符串所需的16位元素(加上任何额外的字符)在创建字符串时左转.)

附录2
的情况下一个字符代表一个 Unicode字符是唯一真正在大多数情况下.这意味着UCS-2编码在2005年之前是真实的.但是到现在为止,Unicode变得越来越大,并且必须使用UTF-16对字符串进行编码 - 其中单个Unicode字符可以在Java中使用两个 char s String.

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


Ral*_*lph 5

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

  • 但这并不能回答问题。您可以将其发布为评论,并以诸如“虽然这不能回答您的问题,但值得注意的是...”之类的内容开始,但这确实是一条有用的信息,尽管我不知道他们使用了UTF- 8。重点是什么?这意味着JVM必须在启动时将每个字符串转换为UTF-16。 (2认同)