繁体   English   中英

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

[英]What is the character encoding of String in Java?

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

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

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

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

  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文档

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

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

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

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

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

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


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

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

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

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

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

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

2)ASCII是UTF-16的子集。

3)Java内部是UTF-16。 其余的,取决于你在哪里,是的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM