【问题标题】:Encoding.UTF8 as DefaultEncoding.UTF8 作为默认值
【发布时间】:2014-03-03 09:34:34
【问题描述】:

我刚刚用StreamWriter写了一个文件,发现必须显式设置编码为Encoding.UTF8才能写汉字,不然就乱码了。

我有两个问题:

  1. 如何将默认编码设置为Encoding.UTF8,这样我就不必总是明确地设置它?
  2. 为什么Encoding.UTF8Encoding.Unicode 不是StreamWriter 的默认值,因为.NET 字符串默认为UTF-16?

【问题讨论】:

    标签: c# .net encoding utf-8 character-encoding


    【解决方案1】:

    为什么 Encoding.UTF8 或 Encoding.Unicode 不是 StreamWriter 的默认值

    UTF8 实际上 StreamWriter 的默认值。来自 StreamWriter(string) 构造函数的 MSDN 文档:

    此构造函数使用 UTF-8 编码创建一个没有字节顺序标记 (BOM) 的 StreamWriter,因此其 GetPreamble 方法返回一个空字节数组。此构造函数的默认 UTF-8 编码在无效字节上引发异常。此行为不同于 Encoding.UTF8 属性中的编码对象提供的行为。要指定 BOM 并确定是否在无效字节上引发异常,请使用接受编码对象作为参数的构造函数,例如 StreamWriter(String, Boolean, Encoding)。

    所以真正的问题在于读取文件的程序,它要求 BOM 能够可靠地解码文件中的文本。这并不完全不寻常。

    遗憾的是,StreamWriter 类必须遵循 Unicode 标准,该标准规定 BOM 是可选很多佩服 Unicode 联盟所做的事情,坦率地说,这个决定不是其中之一。

    您必须适应程序和 Unicode 标准,通过使用带有 Encoding 参数并指定 Encoding.UTF8 的 StreamWriter 构造函数来轻松解决您的问题

    【讨论】:

    • 哇...the StreamWriter constructor overview(我从那里得到我的信息)说 SW(Stream) 默认为 UTF-8,但 SW(string) 默认为“默认编码”,我意思是Encoding.Default,当然不是UTF-8。谈论误导。
    【解决方案2】:

    我刚刚使用StreamWriter 编写了一个文件,发现我有 将编码显式设置为Encoding.UTF8 以使其写入 汉字,不然就乱码了。

    这并不是StreamWriter 的错;只是数据的生产者和消费者在编码上不一致。如果我说英语,你说葡萄牙语,我们不能互相交谈是谁的错?

    如何将默认编码设置为Encoding.UTF8,这样我就不会 必须始终明确设置?

    你可以继承 StreamWriter 和例如制作一个 Utf8StreamWriter 自行设置此属性。但是你必须在任何地方都写Utf8StreamWriter,这与仅仅设置编码并没有什么不同。

    我建议只设置编码。这不是世界末日。或者,请注意constructor which wraps a Stream 确实 使用 UTF-8 作为默认编码。

    为什么Encoding.UTF8(或更大)不是StreamWriter的默认值作为.NET 字符串默认是 UTF-16 吗?

    因为库设计者选择不将其设为默认值。你的代码可能想要产生 UTF-8 输出,但我的可能想要别的东西。显然,没有任何一种选择可以满足我们双方的默认选择。

    此外,编码通常彼此完全无关,无论它们的名称是否相似。说“或更大”是没有意义的。它们是不同的编码;它们的相似之处在于它们都能够对完整的 Unicode 字符集进行编码,但是如何对它们进行编码是不同的。

    【讨论】:

    • “说‘或更大’是没有意义的”——谢谢,说得好。
    • @rhughes:我做了一个小但可能很重要的补充;其中一个构造函数默认为 UTF-8。
    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 2016-12-11
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多