使用StreamWriter写入没有编码参数的文件时使用什么默认编码?

时间:2014-04-25 16:12:26

标签: vb.net encoding streamwriter

我遇到的情况是我们为客户生成一个文件,该文件将包含一些特殊字符,如重音i或a(íá)等。

最初,我们使用此代码打开输出文件:

Using sw As StreamWriter = New StreamWriter(fullpath, True)

但是,íá会在文件中显示为c3 adí的十六进制代码c3 a1的2个字符字节组合对于á

我们通过在写入文件时强制执行Windows1252编码来修复此问题(与Encoding.Default相同,但根据MSDN我们不应该使用Encoding.Default):

Using sw As StreamWriter = New StreamWriter(fullpath, True, Text.Encoding.GetEncoding(1252))

问题:如果{C}没有提供编码参数时,Encoding.Default实际上不是默认编码,那么默认默认值(pardon pun)编码?

问题2:可能与问题1的答案相同,如果您未指定StreamReader参数,Encoding的默认默认编码是什么?

1 个答案:

答案 0 :(得分:2)

嗯,你没有真正解决这个问题。要获得“c3广告”,您必须使用Encoding.Utf8

StreamWriter已经在使用它。但是,它使用Utf8Encoding构造函数来获取 encoderShouldEmitUTF8Identifier 参数并传递 false 。否则称为BOM(字节顺序标记)。 BOM告诉程序明确读取文件使用的Unicode编码。可悲的是,微软无法强制使用BOM,因为Unicode联盟在一个非常不寻常的临时疯狂时刻,可以选择BOM。

它现在可能有效,因为程序无法找到BOM时会回退到系统的默认编码。你可能在1252年猜对了,这很常见,但肯定不能保证。修正:

  Using sw As StreamWriter = New StreamWriter(fullpath, True, Encoding.Utf8)

请注意您使用的 True 参数。哪个文本附加到文件中。如果文件已包含文本,则无法再添加BOM。如果文件以不同的编码开始,这也是一个相当讨厌的问题,你当然不希望得到混合。尽你所能避免使用 True