From here

本质上,字符串使用UTF-16字符编码格式

但当储蓄vs StreamWriter时:

此构造函数使用UTF-8编码创建StreamWriter,而不使用

我看过这个示例(断开的链接被删除):

enter image description here

对于某些字符串来说,utf8更小,而对于其他字符串来说,utf-16更小.

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

非常感谢.

p.s. Ive already read 100

推荐答案

If忽略代理项对(或者等效地,您的应用程序可能需要基本多语言平面之外的字符),UTF-16有一些很好的属性,主要是因 for each 代码单元总是需要两个字节,并且每个代码单元表示所有的BMP字符.

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

当然,我们可以使用UTF-32作为char表示法,但在string表示法中使用UTF-8,我们可以随时随地进行转换.

UTF-16的两个缺点是:

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

(顺便说一句,我认为Windows对Unicode数据使用UTF-16,出于互操作的原因,.NET也应该效仿.不过,这只是把问题推进了一步.)

考虑到代理对的问题,我怀疑如果语言/平台是从头开始设计的,没有互操作要求(但是基于Unicode的文本处理),UTF-16将不是最佳 Select .UTF-8(如果您希望提高内存效率,并且不介意到达第n个字符时的处理复杂性)或UTF-32(反之亦然)将是更好的 Select .(由于规格化形式不同,即使到达第n个字符也有"问题".文本很难.)

.net相关问答推荐

从Couchbase删除_txn文档的推荐方法?""

从窗体中移除另一个控件中引用的控件时获取设计时通知

EFCore.DbSet.Update 方法添加新行而不是更新它

单击关闭按钮时隐藏表单而不是关闭

HttpClient 请求抛出 IOException

IIS Express - 500.19 无法读取配置文件 - 因为它正在查看错误的路径

添加新实体标量时实体框架 4 映射片段错误

是什么让 Enum.HasFlag 这么慢?

HashSet 是否保留插入顺序?

无法将文件 *.mdf 作为数据库附加

静态析构函数

在 .NET Core RC2 中构建 .exe 文件

我可以在没有两个查询的情况下通过布尔标准将 IEnumerable 一分为二吗?

迭代器和枚举器的区别

是否有 Linq 方法可以将单个项目添加到 IEnumerable

String.Replace() 与 StringBuilder.Replace()

我应该绑定到 ICollectionView 还是 ObservableCollection

什么是 .NET 应用程序域?

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

我可以将构造函数参数传递给 Unity 的 Resolve() 方法吗?