我有这段代码可以异步编写文件:
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列为代码集:
遇到问题,因为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
对此有什么问题。
答案 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”