我遇到的情况是我们为客户生成一个文件,该文件将包含一些特殊字符,如重音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
的默认默认编码是什么?
答案 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 。