我刚刚使用StreamWriter
编写了一个文件,发现我必须将编码显式设置为Encoding.UTF8
才能写入中文字符,否则就会出现乱码。
我有两个问题:
Encoding.UTF8
,以便我不必总是明确设置?Encoding.UTF8
或Encoding.Unicode
不是StreamWriter
的默认值,因为.NET字符串默认为UTF-16?答案 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字符进行编码,但 对它们进行编码的方式是不同的。