我一直在阅读有关Unicode代码点如何随时间演变的文章,包括Joel Spolsky的this article,其中提到:
“有些人错误地认为Unicode只是一个16位代码,每个字符占用16位,因此有65536个可能的字符。实际上,这并不正确。”
但尽管阅读了所有这些内容,我仍然找不到Java使用UTF-16作为char的真正原因。
UTF-8难道不比UTF-16更高效吗?例如,如果我有一个包含1024个ASCII范围字符的字符串,UTF-16将占用1024 * 2字节(2KB)的内存。
但如果Java使用UTF-8,它只需要1KB的数据。即使字符串中有一些需要2个字节的字符,它仍然只需要大约1千字节。例如,假设除了1024个字符外,还有10个“字”(代码点U+5b57,UTF-8编码e5 ad 97)。在UTF-8中,这仍然只需要(1024 * 1个字节)+(10 * 3个字节)= 1KB + 30个字节。
所以这并没有回答我的问题。对于UTF-16来说,1KB + 30个字节显然比2KB少。
当然,Java不使用ASCII作为char是有道理的,但为什么它不使用UTF-8呢?UTF-8有一个清晰的机制来处理任意多字节字符,那为什么要在任何具有许多非多字节字符的字符串中浪费内存使用UTF-16呢?
我是否缺少某些关于UTF-16的好理由?
“有些人错误地认为Unicode只是一个16位代码,每个字符占用16位,因此有65536个可能的字符。实际上,这并不正确。”
但尽管阅读了所有这些内容,我仍然找不到Java使用UTF-16作为char的真正原因。
UTF-8难道不比UTF-16更高效吗?例如,如果我有一个包含1024个ASCII范围字符的字符串,UTF-16将占用1024 * 2字节(2KB)的内存。
但如果Java使用UTF-8,它只需要1KB的数据。即使字符串中有一些需要2个字节的字符,它仍然只需要大约1千字节。例如,假设除了1024个字符外,还有10个“字”(代码点U+5b57,UTF-8编码e5 ad 97)。在UTF-8中,这仍然只需要(1024 * 1个字节)+(10 * 3个字节)= 1KB + 30个字节。
所以这并没有回答我的问题。对于UTF-16来说,1KB + 30个字节显然比2KB少。
当然,Java不使用ASCII作为char是有道理的,但为什么它不使用UTF-8呢?UTF-8有一个清晰的机制来处理任意多字节字符,那为什么要在任何具有许多非多字节字符的字符串中浪费内存使用UTF-16呢?
我是否缺少某些关于UTF-16的好理由?