看看这段非常简单的代码:
private static void WriteTestLine(string file, Encoding encoding)
{
// 'Hello, world!' in russian
const string testLine = "Здравствуй, мир!";
using (var streamWriter = new StreamWriter(path: file, append: false, encoding: encoding))
{
streamWriter.WriteLine(testLine);
}
using (var streamReader = new StreamReader(path: file, detectEncodingFromByteOrderMarks: true))
{
Console.WriteLine(streamReader.ReadLine());
}
}
WriteTestLine("utf8", new UTF8Encoding(true));
WriteTestLine("utf7", new UTF7Encoding(true));
WriteTestLine("utf7woOptionals", new UTF7Encoding(false));
此代码生成以下输出:
Здравствуй, мир!
+BBcENARABDAEMgRBBEIEMgRDBDk-, +BDwEOARA-!
+BBcENARABDAEMgRBBEIEMgRDBDk-, +BDwEOARAACE-
如您所见,StreamReader
无法正确检测UTF-7编码。实际上,如果使用十六进制编辑器打开两个UTF-7文件,在这两种情况下前四个字节将如下所示:
2B 42 42 63
但是Wikipedia states UTF-7应该有一个看起来像下列之一的BOM:
2B 2F 76 38
2B 2F 76 39
2B 2F 76 2B
2B 2F 76 2F
2B 2F 76 38 2D
所以我猜.NET的StreamWriter
无法正常使用UTF-7。这看起来很奇怪。我错过了什么吗?如何强制StreamWriter
以UTF-7文件发出BOM?
P.S。顺便说一下:
Encoding.UTF7.GetPreamble();
生成一个空数组