[英]C# Streamwriter - Problem with the encoding
我有一些产品数据要写入 csv 文件。 首先,我有一个 function 将 header 写入 csv 文件:
using(StreamWriter streamWriter = new StreamWriter(path))
{
string[] headerContent = {"banana","apple","orange"};
string header = string.Join(",", headerContent);
streamWriter.WriteLine(header);
}
另一个 function 检查产品并将其数据写入 csv 文件:
using (StreamWriter streamWriter = new StreamWriter(new FileStream(path, FileMode.Open), Encoding.UTF8))
{
foreach (var product in products)
{
await streamWriter.WriteLineAsync(product.ToString());
}
}
当将产品写入 csv 文件并使用FileMode.Open
和Encoding.UTF8
执行此操作时,编码已正确设置到文件中,这意味着德语或法语中的特殊字符可以正确显示。 但这里的问题是,当我这样做时,我会覆盖我的 header。
我尝试的解决方案是不使用FileMode.Open
而是使用FileMode.Append
,但由于某种原因,编码被忽略了。
在保持编码的同时,我可以对 append 数据做些什么? 还有为什么会发生这种情况?
编辑:
FileMode.Open
示例:
Fußpflegecreme
FileMode.Append
示例:
泡沫霜
这里的重要问题是:文件实际包含什么; 例如,如果我使用以下内容:
using System.Text;
string path = "my.txt";
using (StreamWriter streamWriter = new StreamWriter(new FileStream(path, FileMode.Create), Encoding.UTF8))
{
streamWriter.WriteLine("Fußpflegecreme 1");
}
using (StreamWriter streamWriter = new StreamWriter(new FileStream(path, FileMode.Append), Encoding.UTF8))
{
streamWriter.WriteLine("Fußpflegecreme 2");
}
// this next line is lazy and inefficient; only good for quick tests
Console.WriteLine(BitConverter.ToString(File.ReadAllBytes(path)));
然后 output 是(稍微重新格式化):
EF-BB-BF-
46-75-C3-9F-70-66-6C-65-67-65-63-72-65-6D-65-20-31-0D-0A-
46-75-C3-9F-70-66-6C-65-67-65-63-72-65-6D-65-20-32-0D-0A
第一行(注意:原始十六进制中没有任何“行”)是 UTF-8 BOM; 第二行和第三行是正确的 UTF-8 编码的有效载荷。 如果您可以显示在您的案例中写入的确切字节,将会有所帮助。 请问这里真正的问题是不是在你的版本中,没有BOM,但是数据的rest是正确的。 有些工具在没有 BOM 的情况下会选择错误的编码。 而且,一些工具:在存在 BOM 的情况下:会在文件开头错误地显示一些垃圾(并且也可能,因为它们显然没有使用 BOM:使用错误的编码)。 首选方案是:在读取文件时明确指定编码,并使用可以处理 BOM 存在与否的工具。
是否包含 BOM(尤其是在 UTF-8 的情况下)是一个复杂的问题,每个问题都有优点/缺点 - 并且有一些工具可以更好地工作,也可以更糟。 很多UTF-8的文本文件不包含BOM,但是:没有通用的答案。 无论是否有 BOM,实际内容仍然是正确的 UTF-8 编码 - 但如何解释(在任何一种情况下)取决于您用来读取数据的特定工具(以及该工具的配置方式)。
我认为,一旦您在编写 header 时明确选择 utf8 编码,就会解决这个问题。这将为文件添加 BOM 前缀。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.