.net MemoryStream、StreamWriter、FileStream 组合在组合时导致特殊字符
.net MemoryStream, StreamWriter, FileStream combo causes special character when combining
您好,我有以下代码,我从我正在处理的一项更大的任务中缩减了这些代码。本质上,尽管我发现将内存流组合在一起时,我在连接位置上得到了一个特殊字符。以下是显示问题的 运行 应用程序的完整代码。在 Visual Studio 代码中打开生成的 export.csv 文件,代码在第 3 行的开头显示一个特殊字符。如果您在 excel 中打开 CSV,您会注意到第 3 行的开头与其他行的外观不同。
using System;
using System.IO;
using System.Text;
namespace testingMemory
{
class Program
{
static void Main(string[] args)
{
var stream1 = GetMemoryStream("section1");
var stream2 = GetMemoryStream("section2");
var fileStream = new FileStream("export.csv", FileMode.Truncate, FileAccess.Write);
stream1.WriteTo(fileStream);
stream2.WriteTo(fileStream);
}
public static MemoryStream GetMemoryStream(string section)
{
var wrapper = "\"";
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8);
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}1{wrapper}");
streamWriter.Flush();
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}2{wrapper}");
streamWriter.Flush();
return memoryStream;
}
}
}
每个流都包含一个 byte order mark。当您同时复制两者时,第一个流中的字节顺序标记用作文件的 BOM,而第二个只是中间的垃圾。您的内存流不应包含 BOM:
using System;
using System.IO;
using System.Text;
namespace testingMemory
{
class Program
{
static void Main(string[] args)
{
using (var stream1 = GetMemoryStream("section1"))
using (var stream2 = GetMemoryStream("section2"))
{
using (var fileStream = new FileStream("d:\export.csv", FileMode.Truncate, FileAccess.Write))
{
stream1.WriteTo(fileStream);
stream2.WriteTo(fileStream);
}
}
}
public static MemoryStream GetMemoryStream(string section)
{
var wrapper = "\"";
var memoryStream = new MemoryStream();
// Using a non-default UTF-8 encoding with BOM not used:
var streamWriter = new StreamWriter(memoryStream, new UTF8Encoding(false));
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}1{wrapper}");
streamWriter.Flush();
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}2{wrapper}");
streamWriter.Flush();
return memoryStream;
}
}
}
您好,我有以下代码,我从我正在处理的一项更大的任务中缩减了这些代码。本质上,尽管我发现将内存流组合在一起时,我在连接位置上得到了一个特殊字符。以下是显示问题的 运行 应用程序的完整代码。在 Visual Studio 代码中打开生成的 export.csv 文件,代码在第 3 行的开头显示一个特殊字符。如果您在 excel 中打开 CSV,您会注意到第 3 行的开头与其他行的外观不同。
using System;
using System.IO;
using System.Text;
namespace testingMemory
{
class Program
{
static void Main(string[] args)
{
var stream1 = GetMemoryStream("section1");
var stream2 = GetMemoryStream("section2");
var fileStream = new FileStream("export.csv", FileMode.Truncate, FileAccess.Write);
stream1.WriteTo(fileStream);
stream2.WriteTo(fileStream);
}
public static MemoryStream GetMemoryStream(string section)
{
var wrapper = "\"";
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8);
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}1{wrapper}");
streamWriter.Flush();
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}2{wrapper}");
streamWriter.Flush();
return memoryStream;
}
}
}
每个流都包含一个 byte order mark。当您同时复制两者时,第一个流中的字节顺序标记用作文件的 BOM,而第二个只是中间的垃圾。您的内存流不应包含 BOM:
using System;
using System.IO;
using System.Text;
namespace testingMemory
{
class Program
{
static void Main(string[] args)
{
using (var stream1 = GetMemoryStream("section1"))
using (var stream2 = GetMemoryStream("section2"))
{
using (var fileStream = new FileStream("d:\export.csv", FileMode.Truncate, FileAccess.Write))
{
stream1.WriteTo(fileStream);
stream2.WriteTo(fileStream);
}
}
}
public static MemoryStream GetMemoryStream(string section)
{
var wrapper = "\"";
var memoryStream = new MemoryStream();
// Using a non-default UTF-8 encoding with BOM not used:
var streamWriter = new StreamWriter(memoryStream, new UTF8Encoding(false));
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}1{wrapper}");
streamWriter.Flush();
streamWriter.WriteLine($"{wrapper}{section}{wrapper},{wrapper}2{wrapper}");
streamWriter.Flush();
return memoryStream;
}
}
}