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

时间:2012-03-14 09:26:07

标签: java string encoding utf-8 utf-16

我搜索了Java的内部表示形式的String,但我有两种看起来可靠但不一致的材料。

一个是:

  

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

它说:

  

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

另一个是:

  

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

它说:

  

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

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

请告诉我哪一个是正确的以及它使用了多少字节。

6 个答案:

答案 0 :(得分:58)

  

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

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

https://docs.oracle.com/javase/8/docs/technotes/guides/intl/overview.html

  

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

     

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

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

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

  

并支持对字符串序列化进行UTF-8的非标准修改。

序列化字符串默认使用UTF-8。

  

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

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

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

答案 1 :(得分:15)

在Java 9之前,Java String的标准内存表示形式是char[]中保存的UTF-16代码单元。修改后的UTF-8用于其他环境;例如在“.class”文件和对象序列化格式中。

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

使用Java 6更新21及更高版本时,有一个非标准选项(-XX:UseCompressedStrings)来启用压缩字符串。 Java 7中删除了此功能。

对于Java 9及更高版本,如果String已更改为默认情况下使用字符串的紧凑表示,则会出现这种情况。 java命令documentation现在说明了这一点:

  

-XX:-CompactStrings

     

禁用紧凑字符串功能。 默认情况下,此选项已启用。启用此选项时,仅包含单字节字符的Java字符串在内部表示,并使用ISO-8859-1 /存储为单字节每字符字符串Latin-1编码。这减少了50%,仅包含单字节字符的字符串所需的空间量。对于包含至少一个多字节字符的Java字符串:这些字符使用UTF-16编码表示并存储为每个字符2个字节。禁用Compact Strings功能会强制使用UTF-16编码作为所有Java字符串的内部表示。

请注意,“压缩”或“紧凑”字符串均未使用/使用UTF-8编码。

另见:

答案 2 :(得分:12)

<强> UTF-16。

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

  
    

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

  
     

Java编程语言基于Unicode字符集,   并且有几个库实现了Unicode标准。原始人   Java编程语言中的数据类型char是无符号的16位   整数,表示U + 0000到的范围内的Unicode代码点   U + FFFF,或UTF-16的代码单位。各种类型和类别   表示字符序列的Java平台 - char [],   java.lang.CharSequence的实现(例如String类),   和java.text.CharacterIterator的实现 - 是UTF-16   序列。

答案 3 :(得分:3)

char的大小为2个字节。

因此,我会说Java使用UTF-16进行内部字符串表示。

答案 4 :(得分:-6)

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

答案 5 :(得分:-6)

java提供18种国际语言版本和UNICODE字符集,其中包含18种国际语言的所有字符和 包含65536个字符。并且java遵循UTF-16,因此java中char的大小为2个字节。