什么是Java的String的内部表示? 修改UTF-8? UTF-16?

我search了Java的内部表示string,但我有两个看起来可靠但不一致的材料。

一个是:

http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451

它说:

Java使用UTF-16作为内部文本表示,并支持对string序列化的UTF-8进行非标准修改。

另一个是:

http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8

它说:

对于Unicode数据的内部表示,Tcl也使用与Java相同的修改过的UTF-8 [25],但对外部数据使用严格的CESU-8。

修改UTF-8? 或者UTF-16? 哪一个是正确的? Java在内存中使用了多less个字节?

请让我知道哪一个是正确的,它使用多less字节。

Java使用UTF-16作为内部文本表示

在Java中的String和StringBuilder等的表示是UTF-16

http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp

在Java平台中如何表示文本?

Java编程语言基于Unicode字符集,并且多个库实现Unicode标准。 Java编程语言中的原始数据typeschar是一个无符号的16位整数,可以表示U + 0000至U + FFFF范围内的Unicode代码点或UTF-16的代码单元。 表示字符序列的各种types和类 – char [],java.lang.CharSequence的实现(如String类)以及java.text.CharacterIterator的实现 – 都是UTF-16序列。

在JVM级别,如果您使用的是-XX:+UseCompressedStrings (默认用于Java 6的某些更新),实际的内存中表示可以是8位ISO-8859-1,但仅适用于不需要的stringUTF-16编码。

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

并支持对string序列化的UTF-8的非标准修改。

序列化string默认使用UTF-8。

Java在内存中使用了多less个字节?

如果忽略Object中的填充需要, char总是两个字节。

注意:代码点(允许字符> 65535)可以使用一个或两个字符,即2或4个字节。

UTF-16。

http://java.sun.com/javase/technologies/core/basic/intl/faq.jsp

在Java平台中如何表示文本?

Java编程语言基于Unicode字符集,并且多个库实现Unicode标准。 Java编程语言中的原始数据typeschar是一个无符号的16位整数,可以表示U + 0000至U + FFFF范围内的Unicode代码点或UTF-16的代码单元。 表示字符序列的各种types和类 – char [],java.lang.CharSequence(如String类)的实现,以及java.text.CharacterIterator的实现 – 都是UTF-16序列。

Stringtypes的char数组中使用的内存中表示是UTF-16。 修改后的UTF-8在其他情况下使用; 例如在“.class”文件中,以及对象序列化格式。

您可以通过查看java.lang.String类的源代码来确认这一点。

char的大小是2个字节。

因此,我会说Java使用UTF-16来进行内部string表示。

Java在内部将string存储为UTF-16,并为每个字符使用2个字节。

java有18种国际语言和UNICODE字符集,它包含所有可用的18种国际语言的字符,并且包含65536个字符.Java跟在UTF-16之后,所以java中char的大小是2个字节。