StreamWriter不会为UTF-7发出BOM

时间:2014-10-02 16:56:15

标签: c# .net unicode encoding

看看这段非常简单的代码:

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();

生成一个空数组

0 个答案:

没有答案