有什么理由更喜欢 UTF-16 而不是 UTF-8?

2022-09-01 12:43:34

检查UTF-16和UTF-8的属性,我找不到任何理由更喜欢UTF-16。

但是,看看Java和C#,看起来字符串和字符默认为UTF-16。我在想,这可能是出于历史原因,也可能是出于性能原因,但找不到任何信息。

有谁知道为什么这些语言选择UTF-16?我这样做有什么正当理由吗?

编辑:同时,我也找到了这个答案,它似乎相关,并且有一些有趣的链接。


答案 1

东亚语言通常需要比 UTF-8(通常需要 3 个字节)更少的 UTF-16 存储(2 个字节对于 99% 的东亚语言字符就足够了)。

当然,对于西方拉纳格来说,UTF-8通常更小(1字节而不是2字节)。对于像HTML这样的混合文件(有很多标记),这是一个很大的问题。

处理用户模式应用程序的 UTF-16 比处理 UTF-8 稍微容易一些,因为代理项对的行为方式几乎与组合字符的行为方式相同。因此,UTF-16 通常可以作为固定大小的编码进行处理。


答案 2

@Oak:这太长了,无法发表评论...

我不了解C#(而且会感到非常惊讶:这意味着他们只是复制了Java太多),但对于Java来说,这很简单:Java是在Unicode 3.1问世之前构思的。

因此,只有不到65537个码位,因此每个Unicode码位仍然适合16位,因此Java字符诞生了。

当然,这导致了疯狂的问题,这些问题今天仍然影响着Java程序员(像我一样),你有一个方法charAt,在某些情况下,它既不返回Unicode字符也不返回Unicode代码点,还有一个方法(在Java 5中添加)codePointAt,它接受的参数不是你想要跳过的代码点的数量!(您必须向 codePoint 提供要跳过的 Java 字符数,这使其成为 String 类中最不易理解的方法之一)。

所以,是的,这绝对是疯狂的,让大多数Java程序员感到困惑(大多数人甚至没有意识到这些问题),是的,这是出于历史原因。至少,当人们在这个问题之后生气时,这是人们想出的借口:但这是因为Unicode 3.1还没有出来

:)


推荐