UTF-8、UTF-16和UTF-32之间有什么区别?
我知道它们都将存储Unicode,并且每个都使用不同的字节数来表示一个字符。选择一个比另一个有优势吗?
UTF-8、UTF-16和UTF-32之间有什么区别?
我知道它们都将存储Unicode,并且每个都使用不同的字节数来表示一个字符。选择一个比另一个有优势吗?
当前回答
根据您的开发环境,您甚至无法选择字符串数据类型将在内部使用什么编码。
但是对于存储和交换数据,我总是使用UTF-8,如果你有选择的话。如果您的数据主要是ASCII数据,这将为您提供最少的数据传输量,同时仍然能够编码所有内容。优化最小的I/O是现代机器的发展方向。
其他回答
在阅读完答案后,UTF-32需要一些爱。
C#:
Data1 = RandomNumberGenerator.GetBytes(500_000_000);
sw = Stopwatch.StartNew();
int l = Encoding.UTF8.GetString(Data1).Length;
sw.Stop();
Console.WriteLine($"UTF-8: Elapsed - {sw.ElapsedMilliseconds * .001:0.000s} Size - {l:###,###,###}");
sw = Stopwatch.StartNew();
l = Encoding.Unicode.GetString(Data1).Length;
sw.Stop();
Console.WriteLine($"Unicode: Elapsed - {sw.ElapsedMilliseconds * .001:0.000s} Size - {l:###,###,###}");
sw = Stopwatch.StartNew();
l = Encoding.UTF32.GetString(Data1).Length;
sw.Stop();
Console.WriteLine($"UTF-32: Elapsed - {sw.ElapsedMilliseconds * .001:0.000s} Size - {l:###,###,###}");
sw = Stopwatch.StartNew();
l = Encoding.ASCII.GetString(Data1).Length;
sw.Stop();
Console.WriteLine($"ASCII: Elapsed - {sw.ElapsedMilliseconds * .001:0.000s} Size - {l:###,###,###}");
UTF-8—经过9.939秒-大小473,752,800
Unicode—消失0.853秒-大小2.5亿
UTF-32—消失3.143秒-大小125,030,570
ASCII—经过2.362秒-大小500,000,000
Utf-32——丢麦克风
utf - 8
没有字节顺序的概念 每个字符使用1到4个字节 ASCII是一种兼容的编码子集 完全自同步,例如从流中的任何地方删除字节最多只会损坏一个字符 几乎所有的欧洲语言都是用两个字节或更少的字符编码的
utf - 16
必须使用已知的字节顺序进行解析,或者读取字节顺序标记(BOM)。 每个字符使用2或4个字节
utf - 32
每个字符是4个字节 必须使用已知的字节顺序进行解析,或者读取字节顺序标记(BOM)。
UTF-8将是空间效率最高的,除非大多数字符来自CJK(中国、日本和韩国)字符空间。
UTF-32最适合通过字符偏移量随机访问字节数组。
简而言之:
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。
UTF-8为变量1 ~ 4字节。 UTF-16是可变的2或4字节。 UTF-32是固定的4字节。
我做了一些测试来比较MySQL中UTF-8和UTF-16之间的数据库性能。
更新的速度
utf - 8
utf - 16
插入的速度
删除速度