Encoding.UTF8为默认值

时间:2014-02-06 12:24:08

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

我刚刚使用StreamWriter编写了一个文件,发现我必须将编码显式设置为Encoding.UTF8才能写入中文字符,否则就会出现乱码。

我有两个问题:

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

2 个答案:

答案 0 :(得分:3)

  

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

UTF8实际上 是StreamWriter的默认值。从StreamWriter(字符串)构造函数的MSDN文档:

  

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

因此真正的问题在于读取文件的程序,需要 BOM以可靠地解码文件中的文本。这并非完全不寻常。

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

您必须使用该程序和Unicode标准,通过使用带有Encoding参数并指定Encoding.UTF8

的StreamWriter构造函数来解决您的问题。

答案 1 :(得分: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字符进行编码,但 对它们进行编码的方式是不同的。