什么是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序列。
在String
types的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个字节。