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

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


当前回答

如前所述,差异主要在于底层变量的大小,在每种情况下,它们都会变大以允许表示更多字符。

然而,字体、编码和其他东西都非常复杂(没有必要?),所以需要一个大链接来填充更多细节:

http://www.cs.tut.fi/~jkorpela/chars.html#ascii

不要期望理解所有的东西,但是如果你不想在以后遇到问题,尽可能早地学习(或者让别人帮你整理)是值得的。

保罗。

其他回答

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

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

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

更新的速度

utf - 8

utf - 16

插入的速度

删除速度

utf - 8

没有字节顺序的概念 每个字符使用1到4个字节 ASCII是一种兼容的编码子集 完全自同步,例如从流中的任何地方删除字节最多只会损坏一个字符 几乎所有的欧洲语言都是用两个字节或更少的字符编码的

utf - 16

必须使用已知的字节顺序进行解析,或者读取字节顺序标记(BOM)。 每个字符使用2或4个字节

utf - 32

每个字符是4个字节 必须使用已知的字节顺序进行解析,或者读取字节顺序标记(BOM)。

UTF-8将是空间效率最高的,除非大多数字符来自CJK(中国、日本和韩国)字符空间。

UTF-32最适合通过字符偏移量随机访问字节数组。

UTF-8为变量1 ~ 4字节。 UTF-16是可变的2或4字节。 UTF-32是固定的4字节。

简而言之:

UTF-8: Variable-width encoding, backwards compatible with ASCII. ASCII characters (U+0000 to U+007F) take 1 byte, code points U+0080 to U+07FF take 2 bytes, code points U+0800 to U+FFFF take 3 bytes, code points U+10000 to U+10FFFF take 4 bytes. Good for English text, not so good for Asian text. UTF-16: Variable-width encoding. Code points U+0000 to U+FFFF take 2 bytes, code points U+10000 to U+10FFFF take 4 bytes. Bad for English text, good for Asian text. UTF-32: Fixed-width encoding. All code points take four bytes. An enormous memory hog, but fast to operate on. Rarely used.

长:参见维基百科:UTF-8, UTF-16和UTF-32。