为什么.NET使用字符串的UTF16编码,但使用UTF-8作为默认保存文件?(Why does .n

2019-07-20 02:33发布

从这里

从本质上讲,字符串使用UTF-16字符编码形式

但是,当节能VS 的StreamWriter :

这个构造函数使用UTF-8编码的StreamWriter没有字节顺序标记(BOM),

我已经看到了这个样本(断链删除):

它看起来像utf8是一些字符串较小,而utf-16是在其他一些字符串小。

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

谢谢。

PS香港专业教育学院已经阅读了著名的文章

Answer 1:

如果你感到快乐忽略代理对(或等价地,基本多文种平面外你的应用程序需要的字符的可能性),UTF-16有一些不错的性能,基本上是由于总是要求每个代码单元的两个字节,并代表所有BMP字符每一个单独的代码单元。

考虑基本类型char 。 如果我们使用UTF-8作为内存中表示,想应付所有 Unicode字符,有多大会这样? 这可能是长达4个字节...这意味着我们总是要分配4个字节。 在这一点上,我们还不如用UTF-32!

当然,我们可以使用UTF-32作为char的表现,但UTF-8 string表示,转换,因为我们去。

UTF-16的两个缺点是:

  • 的每Unicode字符码单元的数量是可变的,因为不是所有字符 BMP。 直到表情符号开始流行,这并不影响日常的日常使用许多应用程序。 这些天来,肯定使用UTF-16的通讯应用之类的,开发商真的需要了解代理对。
  • 对于纯ASCII(其中大量的文字是,至少在西方)所花费的等效UTF-8编码的文本的两倍的空间。

(作为一个方面说明,我相信Windows使用UTF-16 Unicode数据,它是有道理的.NET跟风互操作的原因。这只是推一万步的问题虽然)。

由于代理对的问题,我想,如果一种语言/平台正在从头开始设计,没有互操作要求(但在统一的基础文本处理),UTF-16不会是最好的选择。 无论是UTF-8(如果你想存储效率和获得的第n个字符而言并不介意一些处理复杂性)或UTF-32(另一种方式圆)会是一个更好的选择。 (即使获得第n个字符有“问题”,由于事情像不同的标准化形式。文字是很难...)



Answer 2:

与许多“为什么这样选择”的问题,这是由历史决定的。 窗口在其1993年的核心变成了统一的操作系统那时候,统一仍只有65535码点,这几天叫UCS代码空间。 但直到1996年为止的Unicode所获得的额外面的编码空间扩展到一百万码点。 和替代对适合他们转换成16位编码,从而设定UTF-16标准。

.NET字符串是UTF-16,因为这是一个非常适合与操作系统编码,则不需要转换。

UTF-8的历史迷雾。 当然过去的Windows NT,从1993年11月过了一段时间,以获得脚保持RFC-3629的日期,互联网是工具。



Answer 3:

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

UTF-16用于在内存中的字符串,因为它是每个字符解析更快,直接映射到Unicode字符类和其他表。 Windows中的所有字符串函数使用UTF-16,并有好几年了。



文章来源: Why does .net uses the UTF16 encoding for string , but uses utf8 as default for saving files?