为什么. net 对字符串使用 UTF16编码,而对保存文件默认使用 UTF-8?

从这里

本质上,string 使用 UTF-16字符编码表单

但在储蓄与 流媒体编剧之间:

此构造函数使用 UTF-8编码创建 StreamWriter,而不使用 字节订单标记(BOM) ,

我已经看到了这个例子(断开的链接删除) :

enter image description here

看起来 utf8对于某些字符串比较小,而 utf-16对于其他字符串比较小。

  • 那么为什么.net 使用 utf16作为字符串的默认编码,使用 utf8作为保存文件的默认编码呢?

谢谢你。

另外,我已经读过 那篇著名的文章

48546 次浏览

如果你乐于忽略代理对(或者相当于你的应用需要基本多语言平面之外的字符) ,UTF-16有一些很好的属性,基本上是因为每个代码单元总是需要两个字节,并且每个代码单元代表所有 BMP 字符。

考虑基元类型 char。如果我们使用 UTF-8作为内存中的表示,并且希望处理 所有 Unicode 字符,那么它应该有多大?它最多可以达到4个字节... 这意味着我们总是要分配4个字节。在这一点上,我们不妨使用 UTF-32!

当然,我们可以使用 UTF-32作为 char表示形式,但是在 string表示形式中使用 UTF-8进行转换。

UTF-16的两个缺点是:

  • 每个 Unicode字符的代码单位数是可变的,因为并非所有的字符 在 BMP。在表情符号流行之前,这并没有影响到许多应用程序的日常使用。如今,当然是对于消息应用程序和类似应用程序,使用 UTF-16的开发人员确实需要了解代理对。
  • 对于纯 ASCII (至少在西方,很多文本都是 ASCII) ,它占用的空间是等效的 UTF-8编码文本的两倍。

(顺便说一句,我相信 Windows 对 Unicode 数据使用 UTF-16,对于。NET 为了互操作的原因而效仿。不过,这只是把问题推向了一个阶段。)

考虑到代理对的问题,我怀疑如果一种语言/平台是从头开始设计的,没有互操作要求(但是基于 Unicode 的文本处理) ,UTF-16不会是最佳选择。无论是 UTF-8(如果您希望提高内存效率,并且不介意在获得第 n 个字符方面的一些处理复杂性)还是 UTF-32(相反)都是更好的选择。(由于不同的规范化形式,甚至到达第 n 个字符都有“问题”。短信很难...)

正如许多“为什么选择这个”的问题一样,这是由历史决定的。Windows 在1993年成为 Unicode 操作系统的核心。当时,Unicode 的代码空间仍然只有65535个代码点,现在称为 UCS。直到1996年,Unicode 获得了补充平面,将编码空间扩展到一百万个编码点。和代理项对,以便将它们放入16位编码中,从而设置 utf-16标准。

NET 字符串是 utf-16,因为它非常适合操作系统编码,不需要转换。

UTF-8的历史比较模糊。绝对过去的 Windows NT,RFC-3629日期从1993年11月。需要一段时间才能站稳脚跟,因特网起到了推动作用。

UTF-8是文本存储和传输的默认形式,因为它对于大多数语言来说是一种相对紧凑的形式(有些语言在 UTF-16中比在 UTF-8中更紧凑)。每种特定的语言都有更高效的编码。

UTF-16用于内存中的字符串,因为它可以更快地解析每个字符并直接映射到 Unicode字符类和其他表。Windows 中的所有字符串函数都使用 UTF-16,并且已经使用多年。