![](/img/trans.png)
[英]Save text file with UTF-16 encoding without Byte Order Mark (BOM) in C#?
[英]skipping Byte Order mark (BOM) when using Stream CopyTo
我正在尝试将文件合并到输出文件中,而我的单个文件上都带有BOM,在使用Stream.CopyTo方法时如何摆脱它。
我的代码如下所示:
using (var output = File.Open(outputFile,FileMode.Append,FileAccess.Write))
{
foreach (var inputFile in inputFiles)
{
using (var input = File.OpenRead(inputFile))
{
input.CopyTo(output);
}
}
}
使用以下方法。
using (var output = File.Open(outputFile,FileMode.Append,FileAccess.Write))
{
foreach (var inputFile in inputFiles)
{
using (var input = File.OpenRead(inputFile))
{
input.Position = Encoding.Unicode.GetPreamble().Length; //The encoding might be any type.
input.CopyTo(output);
}
}
}
不要使用流来复制文本。 请改用StreamReader / StreamWriter:
using (var output = File.AppendText(outputFile))
{
foreach (var inputFile in inputFiles)
{
using (var input = File.OpenText(inputFile))
{
while (!input.EndOfStream)
{
output.WriteLine(input.ReadLine());
}
}
}
}
任何流实例都在字节级别工作,并且对“字符编码”和“ BOM”一无所知。
您不能对任意文件执行此操作。 BOM是几个字节,可能是完全有效的编码。 在下面的示例中,代码恰巧写了一个文件,该文件的字节数与使用UTF-16(小尾数)的UTF-16编码的文本“ ABC”相同,但并不意味着前两个字节代表一个BOM (甚至该文件代表“ ABC”)。
public class StackOverflow_10594371
{
public static void Test()
{
using (FileStream fs = File.Create("a.bin"))
{
fs.WriteByte(0xFF);
fs.WriteByte(0xFE);
fs.WriteByte(0x41);
fs.WriteByte(0x00);
fs.WriteByte(0x42);
fs.WriteByte(0x00);
fs.WriteByte(0x43);
fs.WriteByte(0x00);
}
Console.WriteLine(File.ReadAllText("a.bin"));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.