创建没有BOM的文本文件

时间:2010-03-23 19:32:45

标签: c# asp.net-3.5 text-files byte-order-mark

我试了this aproach但没有成功

我正在使用的代码:

// File name
String filename = String.Format("{0:ddMMyyHHmm}", dtFileCreated);
String filePath = Path.Combine(Server.MapPath("App_Data"), filename + ".txt");

// Process       
myObject pbs = new myObject();         
pbs.GenerateFile();

// pbs.GeneratedFile is a StringBuilder object

// Save file
Encoding utf8WithoutBom = new UTF8Encoding(true);
TextWriter tw = new StreamWriter(filePath, false, utf8WithoutBom);
foreach (string s in pbs.GeneratedFile.ToArray()) 
    tw.WriteLine(s);
tw.Close();

// Push Generated File into Client
Response.Clear();
Response.ContentType = "application/vnd.text";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + ".txt");
Response.TransmitFile(filePath);
Response.End();

结果:

enter image description here

无论是什么,writing the BOM和特殊的字符(如ÆØÅ) 不正确: - /

我被困了!

我的目标是使用 UTF-8 作为编码创建文件,将 8859-1 创建为CharSet

这难以实现,或者我只是度过了糟糕的一天?

非常感谢所有帮助,谢谢!

1 个答案:

答案 0 :(得分:110)

好吧,它写了BOM,因为你在

行指示它
Encoding utf8WithoutBom = new UTF8Encoding(true);

true表示应使用

发出BOM
Encoding utf8WithoutBom = new UTF8Encoding(false);

没有写BOM。

  

我的目标是使用UTF-8创建一个文件作为编码,将8859-1创建为CharSet

可悲的是,无论你是否写过UTF-8,这都是不可能的。即只要您正在编写的字符出现在ISO Latin-1中,它就会像ISO 8859-1文件一样,但是只要输出ISO 8859-1未涵盖的字符(例如ä,ö,ü) )这些字符将被写为多字节字符。

编写真正的ISO-8859-1使用:

Encoding isoLatin1Encoding = Encoding.GetEncoding("ISO-8859-1");

编辑:在balexandre的评论之后

我使用以下代码进行测试......

var filePath = @"c:\temp\test.txt";
var sb = new StringBuilder();
sb.Append("dsfaskd jlsadfj laskjdflasjdf asdkfjalksjdf lkjdsfljas dddd jflasjdflkjasdlfkjasldfl asääääjdflkaslj d f");

Encoding isoLatin1Encoding = Encoding.GetEncoding("ISO-8859-1");

TextWriter tw = new StreamWriter(filePath, false, isoLatin1Encoding);
tw.WriteLine(sb.ToString());
tw.Close();

该文件看起来非常好。显然,在阅读文件时应使用相同的编码