当前位置: 首页 > 面试题库 >

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

澹台承
2023-03-14
问题内容

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兼容性通常很方便。



 类似资料:
  • 我有一个文件,当用geanny显示时*显示UTF-16BE。如果我尝试将这个Java文件转换为不同的编码(假设它是UTF-16BE),那么一个问号(?)每次在新建文件的开头出现。相反,如果我假设它是在UTF-16中(这不是真的),转换后的文件就可以转换了,在开头没有任何问号。有谁能澄清为什么会有这种行为吗?

  • 问题内容: 我们有一个数据输入人员,他在Windows上使用UTF-16编码,并且希望拥有utf-8并删除BOM。utf-8转换有效,但BOM仍然存在。我将如何删除?这是我目前拥有的: 如果我使用hexdump -CI,请参阅: 在结果文件中。如何删除物料清单? 谢谢 问题答案: 只需使用和: 将为您摆脱BOM表(并推断出字节序)。

  • 我有下面的代码,它会产生令人困惑的输出。。 所以我想看看utf-8编码和windows-1252之间的区别。但当我看输出时,似乎没有区别。只有当我将windows-1252与utf-16进行比较时,才会有区别。 输出: 谁能解释一下为什么utf-8和windows-1252看起来一样? 干杯Alex

  • 问题内容: 现在考虑下面给出的代码: 当我尝试调试上面代码中的行时,调试器将我带到String类的方法中,然后将我带到StringCoding类的方法中。在调试过程中,encode方法的第一行()返回“ UTF-8”作为默认编码。我希望它是“ UTF-16”。 该程序的输出为: 最= 6700的Unicode值UTF-8字符=最| 默认值:字节数= 3 对应的UTF-16字符= UTF-16:字节

  • 我编程了一个Android应用程序,它管理要在MySQL数据库中存储和删除的数据(在服务器上)。每当在智能手机上使用特殊字符("ä","ü",...)时,符号转换不良。 在日志中,我可以看到“Umlaut”(例如“ä”)正确传输。我还在我的php文件中使用“SET NAMES‘UTF-8’”,请参见此处: 如果我通过Postman启动请求,我可以添加带有特殊字符的单词,例如“TÄST”,json响

  • 本文向大家介绍ascii、unicode、utf-8、gbk 区别相关面试题,主要包含被问及ascii、unicode、utf-8、gbk 区别时的应答技巧和注意事项,需要的朋友参考一下