一尘不染

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

java

我在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将多少字节用于内存中的char?

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


阅读 478

收藏
2020-03-12

共1个答案

一尘不染

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?

char如果忽略对象中填充的需要,则A 始终为两个字节。

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

2020-03-12