【发布时间】:2021-03-08 03:48:11
【问题描述】:
var orders = new List<Order>();
....
orders.Add(...)
string csvstring;
using (var ms = new MemoryStream())
using (var wr = new StreamWriter(stream, Encoding.UTF8))
using (var csvWriter = new CsvWriter(wr, CultureInfo.InvariantCulture, false))
{
csvWriter.WriteRecords(orders);
csvstring = Encoding.UTF8.GetString(stream.ToArray());
}
然后
sftp.WriteAllText(fileNameAbsolutePath, csvstring, Encoding.UTF8);
在 sftp 中创建的文件的内容以“feff”开头。 " orders.csv: text/plain; charset=utf-8".
这是问题的第一部分。我正在寻找的是将此 UTF8 转换为 IS0-8859-1 为 最终文件中预期的字符集是 IS0-8859-1。
我应该做这样的事情吗?
byte[] bytesSS = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(csvstring));
string s1 = Encoding.GetEncoding("ISO-8859-1").GetString(bytesSS, 0, bytesSS.Length);
尝试在 Google 上搜索“<feff>”,但我完全不了解 BOM 的概念以及解决此问题的方法。
【问题讨论】:
-
如果你想写成IS0-8859-1,你为什么要到处指定UTF8?
-
不涉及
FEFF,CsvHelper 也不会发出 HTTP Content-Type 标头。所有应用程序都可以处理 UTF8。也没有理由使用Encoding.UTF8.GetString。那个sftp变量是什么?为什么要用WriteAllText给它写信? -
如果要创建 Latin1 文件,请在
StreamWriter中使用正确的编码。无论sftp是什么,我都怀疑它有一种将字节写入流的方式。如果要将文件上传到 SFTP 站点,可以使用Stream.CopyTo(Stream)将内存流的内容复制到目标流 -
我把两个问题混在一起,造成了混乱。也许我们现在可以在查看转换之前先讨论 UTF8 编码的第一个问题(请暂时忽略拉丁转换)。首先,我检查了流的当前编码(使用 new StreamReader(stream).CurrentEncoding),发现它是 UTF8;然后尝试使用相同的编码将文件写入 sftp;但它以“feff”结束
-
如果
FEFF的意思是一个 byte 值0xFEFF,它很可能是一个字节顺序标记。默认情况下,StreamWriter 不会发出 BOM,而是发出Encoding.UTF8specifies its use。原因是虽然 UTF8 文件不应该使用 BOM,但 应用程序 直到遇到第一个意外字符时才知道文件是否为 UTF8。
标签: c# encoding iso-8859-1 csvhelper byte-order-mark