UTF-8 和 UTF-16 的区别? [英] Difference between UTF-8 and UTF-16?

查看:46
本文介绍了UTF-8 和 UTF-16 的区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

UTF-8 和 UTF-16 的区别?为什么我们需要这些?

Difference between UTF-8 and UTF-16? Why do we need these?

MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";

md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();

推荐答案

我相信网上有很多关于这方面的好文章,但这里只是一个简短的总结.

I believe there are a lot of good articles about this around the Web, but here is a short summary.

UTF-8 和 UTF-16 都是可变长度编码.但是,在 UTF-8 中,一个字符可能占用最少 8 位,而在 UTF-16 中,字符长度从 16 位开始.

Both UTF-8 and UTF-16 are variable length encodings. However, in UTF-8 a character may occupy a minimum of 8 bits, while in UTF-16 character length starts with 16 bits.

UTF-8 的主要优点:

Main UTF-8 pros:

  • 基本 ASCII 字符,如数字、无重音的拉丁字符等,占用一个字节,与 US-ASCII 表示相同.通过这种方式,所有 US-ASCII 字符串都变成有效的 UTF-8,这在许多情况下提供了不错的向后兼容性.
  • 没有空字节,允许使用以空字符结尾的字符串,这也引入了大量的向后兼容性.
  • UTF-8 独立于字节顺序,因此您不必担心 Big Endian/Little Endian 问题.

UTF-8 的主要缺点:

Main UTF-8 cons:

  • 许多常见字符的长度不同,这会减慢按代码点编制索引的速度,并且会严重地计算代码点计数.
  • 尽管字节顺序无关紧要,但有时 UTF-8 仍然具有 BOM(字节顺序标记),用于通知文本是以 UTF-8 编码的,并且即使文本只有文本,也会破坏与 ASCII 软件的兼容性包含 ASCII 字符.Microsoft 软件(如记事本)特别喜欢将 BOM 添加到 UTF-8.

UTF-16 的主要优点:

Main UTF-16 pros:

  • BMP(基本多语言平面)字符,包括拉丁文、西里尔文、大多数中文(中华人民共和国强制支持一些 BMP 之外的代码点),大多数日语可以用 2 个字节表示.如果文本包含补充字符,这会加快索引和计算代码点计数.
  • 即使文本有增补字符,它们仍然由成对的 16 位值表示,这意味着总长度仍然可以被 2 整除,并且允许使用 16 位 char 作为字符串的原始组件.
  • BMP (basic multilingual plane) characters, including Latin, Cyrillic, most Chinese (the PRC made support for some codepoints outside BMP mandatory), most Japanese can be represented with 2 bytes. This speeds up indexing and calculating codepoint count in case the text does not contain supplementary characters.
  • Even if the text has supplementary characters, they are still represented by pairs of 16-bit values, which means that the total length is still divisible by two and allows to use 16-bit char as the primitive component of the string.

UTF-16 的主要缺点:

Main UTF-16 cons:

  • US-ASCII 字符串中有很多空字节,这意味着没有以空字符结尾的字符串和大量浪费的内存.
  • 在许多常见情况下(尤其是在美国/欧盟/使用西里尔字母的国家/以色列/阿拉伯国家/伊朗和许多其他国家/地区)将其用作固定长度的编码大多有效",通常会导致支持中断'不.这意味着程序员必须了解代理对并在重要的情况下正确处理它们!
  • 它是可变长度的,因此计算或索引代码点的成本很高,但低于 UTF-8.

总的来说,UTF-16 通常更适合内存表示,因为 BE/LE 在那里无关紧要(仅使用本机顺序)并且索引速度更快(只是不要忘记正确处理代理对).另一方面,UTF-8 非常适合文本文件和网络协议,因为它不存在 BE/LE 问题,而且空终止经常派上用场,并且与 ASCII 兼容.

In general, UTF-16 is usually better for in-memory representation because BE/LE is irrelevant there (just use native order) and indexing is faster (just don't forget to handle surrogate pairs properly). UTF-8, on the other hand, is extremely good for text files and network protocols because there is no BE/LE issue and null-termination often comes in handy, as well as ASCII-compatibility.

这篇关于UTF-8 和 UTF-16 的区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆