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();
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();
我相信网上有很多关于这方面的好文章,但这里有一个简短的总结。
UTF-8 和 UTF-16 都是可变长度编码。但是,在 UTF-8 中,字符可能至少占用 8 位,而在 UTF-16 字符中,字符长度从 16 位开始。
UTF-8 的主要优点:
UTF-8 的主要缺点:
UTF-16 的主要优点:
char
UTF-16 的主要缺点:
通常,UTF-16 通常更适合内存中的表示,因为 BE/LE 在那里无关紧要(只是使用本机顺序)并且索引更快(只是不要忘记正确处理代理项对)。另一方面,UTF-8对于文本文件和网络协议非常好,因为没有BE / LE问题,空终止通常派上用场,以及ASCII兼容性。
它们只是表示 Unicode 字符的不同方案。
两者都是可变长度的 - UTF-16 对基本多语言平面 (BMP) 中的所有字符使用 2 个字节,其中包含最常用的大多数字符。
UTF-8 对 BMP 中的字符使用 1 到 3 个字节,对于当前 Unicode 范围 U+0000 到 U+1FFFFF 中的字符,最多使用 4 个字节,如果需要,可以扩展到 U+7FFFFFFFFF...但值得注意的是,所有 ASCII 字符都以单个字节表示。
出于消息摘要的目的,选择其中哪一个并不重要,只要尝试重新创建摘要的每个人都使用相同的选项即可。
有关 UTF-8 和 Unicode 的更多信息,请参阅此页面。
(请注意,所有 Java 字符都是 BMP 中的 UTF-16 码位;要表示 U+FFFF 以上的字符,您需要在 Java 中使用代理项对。