UTF-8、UTF-16和UTF-32之间有什么区别?

我知道它们都将存储Unicode,并且每个都使用不同的字节数来表示一个字符。选择一个比另一个有优势吗?


当前回答

UTF-8在ASCII字符代表文本块中的大部分字符的情况下具有优势,因为UTF-8将这些字符编码为8位(像ASCII一样)。它的另一个优点是只包含ASCII字符的UTF-8文件具有与ASCII文件相同的编码。

在ASCII不占主导地位的情况下,UTF-16更好,因为它主要每个字符使用2个字节。UTF-8将开始对高阶字符使用3个或更多字节,而UTF-16对大多数字符仅使用2个字节。

UTF-32将在4字节内涵盖所有可能的字符。这使得它非常臃肿。我想不出使用它有什么好处。

其他回答

我做了一些测试来比较MySQL中UTF-8和UTF-16之间的数据库性能。

更新的速度

utf - 8

utf - 16

插入的速度

删除速度

在UTF-32中,所有字符都用32位编码。这样做的好处是可以很容易地计算字符串的长度。缺点是对于每个ASCII字符,您会浪费额外的3个字节。

在UTF-8字符有可变长度,ASCII字符编码为一个字节(8位),大多数西方特殊字符编码为两个字节或三个字节(例如€是三个字节),更奇特的字符可以占用四个字节。明显的缺点是,先验你不能计算字符串的长度。但与UTF-32相比,编码拉丁(英语)字母文本所需的字节要少得多。

UTF-16也是可变长度的。字符编码为两个字节或四个字节。我真的不明白这有什么意义。它有可变长度的缺点,但没有像UTF-8那样节省空间的优点。

在这三种语言中,UTF-8显然是传播最广泛的。

我试图在我的博客中给出一个简单的解释。

utf - 32

需要32位(4字节)来编码任何字符。例如,为了使用这个方案来表示“A”字符代码点,你需要用32位二进制数字写65:

00000000 00000000 00000000 01000001 (Big Endian)

如果仔细观察,您会注意到最右边的7位实际上是使用ASCII格式时的相同位。但是由于UTF-32是固定宽度的方案,我们必须附加三个额外的字节。这意味着,如果我们有两个只包含“A”字符的文件,一个是ascii编码的,另一个是UTF-32编码的,它们的大小将分别为1字节和4字节。

utf - 16

许多人认为UTF-32使用固定宽度的32位来表示码位,UTF-16是固定宽度的16位。错了!

在UTF-16中,码位可以用16位或32位表示。所以这个方案是变长编码系统。与UTF-32相比,它的优势是什么?至少对于ASCII,文件的大小不会是原始文件的4倍(但仍然是两倍),所以我们仍然不能向后兼容ASCII。

由于7位足以表示“A”字符,我们现在可以使用2个字节,而不是像UTF-32那样使用4个字节。它看起来是这样的:

00000000 01000001

utf - 8

你猜对了。在UTF-8中,码位可以用32位、16位、24位或8位来表示,作为UTF-16系统,这也是一种变长编码系统。

最后,我们可以用与ASCII编码系统相同的方式来表示“A”:

01001101

一个小例子,UTF-16实际上比UTF-8更好:

考虑中文字母“語”,它的UTF-8编码是:

11101000 10101010 10011110

虽然它的UTF-16编码较短:

10001010 10011110

为了了解这种表达方式以及它是如何解释的,请访问原文。

简而言之,使用UTF-16或UTF-32的唯一原因是分别支持非英语和古代脚本。

我想知道为什么有人会选择非utf -8编码,因为它显然对web/编程更有效。

一个常见的误解-加后缀的数字不是它的能力的指示。它们都支持完整的Unicode,只是UTF-8可以用一个字节处理ASCII,所以对CPU和互联网来说更有效/更不容易损坏。

一些不错的阅读:http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/10/which_utf_do_i_use.html 和http://utf8everywhere.org

根据您的开发环境,您甚至无法选择字符串数据类型将在内部使用什么编码。

但是对于存储和交换数据,我总是使用UTF-8,如果你有选择的话。如果您的数据主要是ASCII数据,这将为您提供最少的数据传输量,同时仍然能够编码所有内容。优化最小的I/O是现代机器的发展方向。