我有一个用UTF32编码的CSV。当我在IE中打开流并用Excel打开时,我可以读取所有内容。在iPad上我流式传输,我得到一个没有任何内容的空白页面。 (我不知道如何在iPad上查看源代码,因此HTML中可能存在隐藏的内容)。
http响应是用asp.net C#
编写的Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/comma-separated-values";
Response.AddHeader("Content-Disposition", "attachment;filename=\"InventoryCount.csv\"");
Response.RedirectLocation = "InventoryCount.csv";
Response.ContentEncoding = Encoding.UTF32;//works on Excel wrong in iPad
//Response.ContentEncoding = Encoding.UTF8;//works on iPad wrong in Excel
Response.Charset = "UTF-8";//tried also adding Charset just to see if it works somehow, but it does not.
EnableViewState = false;
NMDUtilities.Export oUtilities = new NMDUtilities.Export();
Response.Write(oUtilities.DataGridToCSV(gvExport, ","));
Response.End();
我唯一猜到的是iPad无法读取UTF32,是真的吗?如何在iPad上查看来源?
<小时/> 的更新
iPad UTF8输出=“Quattrode®”
Excel UTF8输出=“Quattrode®”
iPad UTF32输出=“”
Excel UTF32输出=“Quattrode®”
这是我对DataGridToCsv
的实现public string DataGridToCsv(GridView input, string delimiter)
{
StringBuilder sb = new StringBuilder();
//iterate Gridview and put row results in stringbuilder...
string result = HttpUtility.HtmlDecode(sb.ToString());
return result;
}
<小时/> UPDATE2 Excel is barfing on UTF8&gt;:{。人。我只是解开了他列出的第二个选项,因为它在iPad上不起作用。我不能因为失败而获胜。
UPDATE3
根据您的建议,我查看了十六进制代码。没有BOM,但文件布局之间存在差异。
UTF8
4D 61 74 65 (MATE来自第一个单词MATERIAL)
UTF32
4D 00 00 00 (M来自第一个单词MATERIAL)
所以看起来UTF32在32位中比在UTF8中以8位进行处理。我想这就是Excel可以猜到的原因。现在,我将尝试您建议的修复程序。
答案 0 :(得分:7)
问题是浏览器知道你的数据的编码是UTF-8,但它无法告诉Excel。当Excel打开文件时,它会假定您的系统是默认编码。如果您复制一些非ASCII文本,将其粘贴到记事本中,并使用UTF-8编码保存,但是,您将看到Excel可以正确检测它。它适用于iPad,因为它的默认编码恰好是UTF-8。
原因是记事本在文件的开头放置了正确的byte order mark(EF BB BF
为UTF-8)。您可以使用十六进制编辑器或其他方法自行尝试创建包含
EF BB BF 20 51 75 61 74 74 72 6F 64 65 C2 AE 20
并在Excel中打开该文件。 (我使用的是Excel 2010,但我认为它适用于所有最新版本。)
尝试确保输出以前3个字节开头。
<小时/> 如何在C#中编写BOM?
byte[] BOM = new byte[] { 0xef, 0xbb, 0xbf };
Response.BinaryWrite(BOM);//write the BOM first
Response.Write(utility.DataGridToCSV(gvExport, ","));//then write your CSV
答案 1 :(得分:2)
Excel会尝试根据您的文件内容推断编码,并且ASCII和UTF-8恰好在前128个字符(字母和数字)上重叠。当您使用UTF-16和UTF-32时,它可以确定内容不是ASCII,但由于您使用UTF-8的大部分内容都与ASCII匹配,如果您希望以UTF-8读取文件,你必须通过写下Gabe在答案中说的字节顺序标记明确地告诉它内容是UTF-8。另外,请参阅Andrew Csontos关于另一个问题的答案: