From here
从本质上讲,字符串使用UTF-16字符编码形式
但是当保存vs StreamWriter时:
此构造函数创建一个不带字节顺序标记(BOM)的UTF-8编码StreamWriter,
我看过这个例子(断开的链接删除):
看起来utf8
在某些字符串中更小,而utf-16
在其他字符串中更小。
- 那么为什么.net使用
utf16
作为字符串的默认编码,而使用utf8
保存文件呢?
谢谢
- p.s.我已经读过the famous article *
From here
从本质上讲,字符串使用UTF-16字符编码形式
但是当保存vs StreamWriter时:
此构造函数创建一个不带字节顺序标记(BOM)的UTF-8编码StreamWriter,
我看过这个例子(断开的链接删除):
看起来utf8
在某些字符串中更小,而utf-16
在其他字符串中更小。
utf16
作为字符串的默认编码,而使用utf8
保存文件呢?谢谢
3条答案
按热度按时间brtdzjyr1#
考虑原始类型
char
。如果我们使用UTF-8作为内存中的表示,并希望科普 * 所有 * Unicode字符,那么它应该有多大?它可以是4个字节…这意味着我们总是要分配4个字节。在这一点上,我们不妨使用UTF-32!当然,我们可以使用UTF-32作为
char
表示,但在string
表示中使用UTF-8,并在我们进行转换。UTF-16的两个缺点是:
(As顺便说一下,我相信Windows使用UTF-16作为Unicode数据,而.NET出于互操作的原因也是有意义的。这只是把问题推到了一步。)
考虑到代理对的问题,我怀疑如果一种语言/平台是从头开始设计的,没有互操作需求(但基于Unicode的文本处理),UTF-16不会是最好的选择。UTF-8(如果您想要内存效率,并且不介意处理第n个字符的复杂性)或UTF-32(反过来)将是更好的选择。(由于不同的规范化形式等原因,即使到达第n个字符也会有“问题”。文字很难……)
nhaq1z212#
与许多“为什么选择这个”的问题一样,这是由历史决定的。Windows在1993年成为Unicode操作系统。当时,Unicode仍然只有65535个代码点的代码空间,现在称为UCS。直到1996年,Unicode才获得了补充平面,将编码空间扩展到了100万个码点。和代理项对,以使它们适合16位编码,从而制定utf-16标准。
.NET字符串是utf-16,因为它非常适合操作系统编码,不需要转换。
utf-8的历史则更加模糊。RFC-3629是1993年11月发布的。花了一段时间才站稳脚跟,互联网是工具。
xytpbqjk3#
UTF-8是文本存储和传输的默认格式,因为对于大多数语言来说,它是一种相对紧凑的格式(有些语言的UTF-16格式比UTF-8格式更紧凑)。每种特定的语言都有更有效的编码。
UTF-16用于内存中的字符串,因为它可以更快地解析每个字符,并直接Map到Unicode字符类和其他表。Windows中的所有字符串函数都使用UTF-16,并且已经使用了很多年。