70

我尝试了这种方法但没有成功

我正在使用的代码:

// 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();

结果:

在此处输入图像描述

无论如何,它都在编写 BOM ,并且特殊字符(如 Æ Ø Å)不正确:-/

我被困住了!

我的目标是使用UTF-8作为 Encoding 和8859-1作为 CharSet创建一个文件

这是很难完成还是我只是度过了糟糕的一天?

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

4

1 回答 1

171

好吧,它会写入 BOM,因为您正在指示它在行中

Encoding utf8WithoutBom = new UTF8Encoding(true);

true意味着应该发出 BOM,使用

Encoding utf8WithoutBom = new UTF8Encoding(false);

不写入 BOM。

我的目标是使用 UTF-8 作为 Encoding 和 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();

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

于 2010-03-23T19:41:31.523 回答