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();
Answers:
我相信Web上有很多关于此的好文章,但这是一个简短的摘要。
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 + 7FFFFFFF。但值得注意的是,所有ASCII字符均以单个字节表示。
出于消息摘要的目的,选择哪个选项无关紧要,只要尝试重新创建摘要的每个人都使用相同的选项即可。
有关UTF-8和Unicode的更多信息,请参见此页面。
(请注意,所有Java字符都是BMP中的UTF-16代码点;要表示U + FFFF以上的字符,您需要在Java中使用代理对。)