3

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

    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. 该类有 15 个重载构造函数,FileStream如果不在编码文本上,我应该在哪里设置它对我来说根本不明显。

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

在此处输入图像描述

有问题,因为 MySQLLOAD 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,MySQLLOAD INFILE仍然失败。在 Textpad 中重新保存,MySQL 正确地看到了它。

将代码更改为:

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

这似乎对两者都有效。我不确定 MySQL 有什么问题LOAD INFILE

4

2 回答 2

4

不,绝对是 UTF-8:

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

那只能给你UTF-8;然后你写入encodedText流。

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

于 2012-10-23T14:43:45.857 回答
2

我相信您忘记将BOM 标头写入文件的开头。当您使用 FileStream(而不是某种 TextWriter)时,您必须手动编写它。如果是 UTF-8,它应该是“EF BB BF”

于 2012-10-23T14:43:52.340 回答