Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# (简单)带特殊字符的CSV下载让我抓狂_C#_Asp.net Mvc_Encoding_Character Encoding_Download - Fatal编程技术网

C# (简单)带特殊字符的CSV下载让我抓狂

C# (简单)带特殊字符的CSV下载让我抓狂,c#,asp.net-mvc,encoding,character-encoding,download,C#,Asp.net Mvc,Encoding,Character Encoding,Download,这件事快把我逼疯了。 上个星期我以为我弄坏了坚果,但不幸的是没有 因此,我想为其他用户创建一个CSV下载,以便在MS Word中打开(他们需要CSV格式) 因此,我在MVC2控制器中使用了以下代码: Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv"); Response.ContentType = "application/csv"; string s = new Downl

这件事快把我逼疯了。 上个星期我以为我弄坏了坚果,但不幸的是没有

因此,我想为其他用户创建一个CSV下载,以便在MS Word中打开(他们需要CSV格式)

因此,我在MVC2控制器中使用了以下代码:

Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
Response.ContentType = "application/csv";
string s = new DownloadService().GetAddresses();
Response.Write(s);
Response.End();
return null;
字符串“s”包含(除其他信息外)这些字符:éåæÉa

当我在记事本中打开它时:好的

当我在记事本中打开它时++:Ok

当我在Excel中打开它时:不好,它显示:éåÃÉÃ

(当我在Notepadd++中打开它时,它说它是UTF8编码,没有BOM表,无论我在构造函数中尝试使用带布尔值的UTF8编码来获取BOM表,都没有成功)

上周我问了一个问题,答案是让GetAddresses()函数返回一个字节数组

因此,我确实使用以下方法转换了文本:

// C# to convert a string to a byte array.
public static byte[] StrToByteArray(string str)
{
    System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding();
    return encoding.GetBytes(str);
}
,并在响应中写入字节数组,一切正常!记事本,记事本++和Excel! 很好,生活是美好的

但后来我发现他们正在用Word打开文件。我想没问题

但是,他们接着说:Word无法(直接)打开文件,它首先要求编码,这是一个问题,因为他们在自动化过程中使用它

当他们在记事本中打开文件并将其保存为unicode时,一切都很顺利

我也在行动方法中尝试过:

Response.ContentEncoding = Encoding.Unicode ;
Response.HeaderEncoding = Encoding.UTF8;
但这没有帮助


有人有任何线索吗?

尝试使用
ISO-8859-1
而不是
UTF-8

public ActionResult Index()
{
    var encoding = Encoding.GetEncoding("iso-8859-1");
    var data = encoding.GetBytes("éåæÉà;some other value");
    return File(data, "application/csv", "PersonalMessages.csv");
}
还要注意略微简化和使用
FileResult

我建议您的另一种可能性是明确附加序言,以便Excel能够识别UTF-8编码:

public ActionResult Index()
{
    var data = Encoding.UTF8.GetBytes("éåæÉà;some other value");
    var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
    return File(result, "application/csv;charset=utf-8", "PersonalMessages.csv");
}

使用ISO-8859-1代替UTF-8

工作正常


我在XLSX文档中尝试过。

我尝试过许多编码,其中有效的是
Windows-1252

Response.Clear();
Response.ContentType = "Application/x-msexcel";
Response.AddHeader("content-disposition", "attachment; filename=\"filename.csv\"");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Windows-1252");
Response.Write(string.Join(Environment.NewLine, myDataLines));
Response.End();

你尝试了很多的问题的不利方面是,它变成了一个为他人阅读的大故事,如果你花时间阅读所有内容并同时阅读这篇评论,那你就功劳了……不幸的是,这没有奏效。我已经尝试了你说的两种解决方案,evrn从字面上说就是那个代码,所以我删除了我的代码,这样就不会碍事了。记事本、记事本++和excel喜欢这些代码,但当我将文件保存到磁盘并用Ms Word(10)打开它时,它(Word)会询问文件的编码方式……@Michel,Word在遇到非ASCII字符时总是这样做。尝试在Excel中保存包含这些特殊字符的CSV文件,然后在Word中打开它。它会问你关于编码的问题。哇。我认为这很糟糕(可能有很好的理由)。我也用记事本试过了:创建新文件,粘贴这个“åæÉ”,关闭并保存,用Word打开,实际上,Word询问编码。客户说,当他们从记事本显式地将其保存为unicode时,Word会毫无疑问地打开它(他们将其用作mailmerge的源代码)。当我从记事本中将其保存为unicode并在Word中打开时(而不是作为mailmerge),它确实要求编码。我收到了错误“非可开票成员“文件”不能用作方法”。有人知道为什么会这样?在我的例子中,这只是Excel中的一个撇号问题。第一个解决方案对我很有效!我在MS Word中打开文件时也进行了检查,并按预期工作。use Response.ContentEncoding=我的区域设置编码适合我