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

Joh*_*Lim 46 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在内存中使用了多少字节?

请让我知道哪一个是正确的以及它使用了多少字节.

Pet*_*rey 57

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如果忽略对象中填充的需要,则A 总是两个字节.

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

  • Java序列化(和类文件)[使用修改后的CESU-8](http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8),这是一个修改过的UTF-8. (2认同)
  • @Praxeolitic 字节序是处理器固有的。通常很少,但它几乎不重要。 (2认同)
  • 这个答案已经过时了。一般来说,您不应该假设知道内部表示是什么样的。如果要保存此答案而不是报告 BS,则应使用特定的运行时或出现这种情况的运行时来更新它。 (2认同)

Ste*_*n C 20

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

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

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

对于Java 9及更高版本,默认情况下,行为if String已更改为使用Strings的紧凑表示形式.该命令的文档现在这样说:java

-XX:-CompactStrings

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

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

也可以看看:


And*_*son 12

UTF-16.

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

文本如何在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序列.