创建UTF8文本文件而不是ANSI

时间:2012-10-23 14:39:16

标签: c# visual-studio-2012 .net-4.5

我有这段代码可以异步编写文件:

    private static async Task WriteTextAsync(string filePath, string text)
    { //Writes to our output files
        byte[] encodedText = Encoding.UTF8.GetBytes(text);
        using (FileStream sourceStream = new FileStream(filePath,
            FileMode.Create, FileAccess.Write, FileShare.None,
            bufferSize: 4096, useAsync: true))
        {
            await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
        };
    }

尽管设置了Encoding.UTF8,创建的文本文件仍然是ANSI格式。 FileStream类有15个重载的构造函数,对于我来说,如果没有编码文本,我应该设置它,这一点并不明显。

我可以告诉该文件是ANSI,因为当我在TextPad中打开它并查看文件统计信息时,它将ANSI列为代码集:

enter image description here

遇到问题,因为MySQL LOAD INFILE没有正确读取文件,在阅读完答案之后我认为它与BOM有关,但不确定。

我试过这个(用于BOM):

        byte[] encodedText = new byte[] { 0xEF, 0xBB, 0xBF }.Concat(Encoding.UTF8.GetBytes(text)).ToArray();
        using (FileStream sourceStream = new FileStream(filePath,
            FileMode.Create, FileAccess.Write, FileShare.None,
            bufferSize: 4096, useAsync: true))
        {
            await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
        };
然后

Textpad将其视为UTF8,MySQL LOAD INFILE仍然失败。在Textpad中重新保存,MySQL正确看到它。

将代码更改为:

        using (TextWriter writer = File.CreateText(filePath))
        {
            await writer.WriteAsync(text);
        }

这似乎兼而有之。我不确定MySQL LOAD INFILE对此有什么问题。

2 个答案:

答案 0 :(得分:4)

不,绝对是UTF-8:

byte[] encodedText = Encoding.UTF8.GetBytes(text);

只能给你UTF-8;然后,您将encodedText写入流。

然而!对于0-127范围内的任何字符,UTF-8看起来与ASCII / ANSI相同。它只是看起来不同。误报?

答案 1 :(得分:2)

我相信你忘了把BOM header写到文件的开头。当您使用FileStream(而不是某种TextWriter)时,您必须手动编写它。 在UTF-8的情况下,它应该是“EF BB BF”