UTF-8和UTF-16之间的区别?

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

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();

回答:

我相信Web上有很多关于此的好文章,但这是一个简短的摘要。

UTF-8和UTF-16都是可变长度编码。但是,在UTF-8中,字符可能至少占据8位,而在UTF-16中,字符长度以16位开始。

UTF-8主要优点:

  • 基本ASCII字符(例如数字,不带重音的拉丁字符等)占据一个字节,与US-ASCII表示形式相同。这样,所有US-ASCII字符串都变为有效的UTF-8,在许多情况下,它都提供了良好的向后兼容性。
  • 没有空字节,允许使用以空终止的字符串,这也引入了大量的向后兼容性。
  • UTF-8与字节顺序无关,因此您不必担心Big Endian / Little Endian问题。

UTF-8主要缺点:

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

UTF-16主要优点:

  • BMP(基本多语言平面)字符,包括拉丁语,西里尔字母,大多数中文(中华人民共和国对BMP以外的某些代码点提供了强制性支持),大多数日语可用2个字节表示。这将加快索引和计算代码点计数情况下,文中 包含增补字符。
  • 即使文本具有补充字符,它们仍将由成对的16位值表示,这意味着总长度仍可被2整除,并允许使用16位char作为字符串的原始成分。

UTF-16主要缺点:

  • US-ASCII字符串中有很多空字节,这意味着没有以空字符结尾的字符串和大量的内存浪费。
  • 在许多常见情况下(尤其是在美国/欧盟/使用西里尔字母的国家/以色列/阿拉伯国家/伊朗等),将其用作固定长度编码“通常是有效的”,通常会在不起作用的情况下导致支持中断。
  • 它的长度是可变的,因此尽管计数点数或索引点数比UTF-8小,但成本很高。

通常,UTF-16通常更适合于内存中表示,因为BE /

LE在那里无关紧要(仅使用本机顺序)并且索引速度更快(只是不要忘记正确处理代理对)。另一方面,UTF-8非常适合文本文件和网络协议,因为它不存在BE /

LE问题,并且空位终止和ASCII兼容性通常很方便。

以上是 UTF-8和UTF-16之间的区别? 的全部内容, 来源链接: utcz.com/qa/431316.html

回到顶部