2

有一个问题,即 streamwriter 在我正在生成的 csv 中生成错误字符。字符仅出现在文件的开头:

5,"GEN",555555555,,"Evan","Smith",,,,,,,,,,,,,,,,,,,,,,,,,"email@someplace.com"
5,"GEN",555555555,,"Dorathy","Smith",,,,,,,,,,,,,,,,,,,,,,,,,"email@someplace.com"
5,"GEN",555555555,,"Marvin","Smith",,,,,,,,,,,,,,,,,,,,,,,,,"email@someplace.com"
....

在我看来像一个编码问题。我尝试了不同的编码以及一个正则表达式来清理字符串,但运气不佳。这是预览代码(虽然它并不复杂)。它也作为 Web 进程运行。

string fileName = includeEmail == false ? "attachment; filename=stuacct_batch.txt" : "attachment; filename=rentals.csv";
Context.Response.Clear();
Context.Response.AddHeader("content-disposition", fileName);
Context.Response.ContentType = includeEmail == false ? "text/plain" : "text/csv";

using (StreamWriter sw = new StreamWriter(Response.OutputStream, Encoding.UTF8))
{   
    string line = "";
    foreach (Student s in students)
    {
        // ... some logic above that that's misc. to this problem 
        line = "5,\"GEN\"," + s.StudentNumber + ",,\"" + s.FirstName + "\",\"" + s.LastName + "\",,,,,,,,,,,,,,,,,,,,,,,,,\"" + s.Email + "\"";
        sw.WriteLine(line);
    }
}

Context.Response.End();
Context.Response.Flush();
Context.ApplicationInstance.CompleteRequest();
4

2 回答 2

8

您已指定要对流使用 UTF-8 编码,并且这些初始字节是有效的 UTF-8 字节顺序标记 (BOM)。问题显然是您的查看器/编辑器没有正确解码 UTF-8 流。如果只有 BOM 是问题,并且您想创建没有 BOM 的流,您可以创建自己的UTF8Encoding类实例:

var encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
using (StreamWriter sw = new StreamWriter(Response.OutputStream, encoding)) ...

如果您真的想使用 ASCII 数据,您应该使用该编码:

using (StreamWriter sw = new StreamWriter(Response.OutputStream, Encoding.ASCII)) ...
于 2012-04-25T15:42:49.533 回答
0

这些可能是指定文件是 unicode 而不是 ansi 的字符。

您是否在文本编辑器中将文件作为 ANSI 文件打开?如果是这样,这就是你看到角色的原因。尝试以 unicode 格式打开它,或者将您的编码设置为非 unicode。

于 2012-04-25T15:32:58.883 回答