如何对Unicode进行编码,以便iPad和Excel都能理解

本文关键字:iPad 以便 Excel 能理解 编码 Unicode | 更新日期: 2023-09-27 18:00:26

我有一个用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上查看源代码?


更新
我刚刚有了一个有趣的发现。当我的编码是UTF8时,iPad上的东西可以正常显示字符,但Excel会把字符搞砸。但当我使用UTF32时,情况正好相反。iPad什么都不显示,但Excel运行得很好。我真的不知道该怎么办。

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;
}


UPDATE2Excel在UTF8>:{.天哪。我刚刚取消了他列出的第二个选项,因为它在iPad上不起作用。在这个选项上输了我赢不了。

UPDATE3
根据您的建议,我已经查看了十六进制代码。没有BOM表,但文件布局之间存在差异。

UTF8
4D 61 74 65(MATE来自第一个单词MATERIAL)
UTF32
4D 00 00 00(M来自第一个单词MATERIAL)

因此,看起来UTF32以32位布局,而UTF8以8位布局。我认为这就是Excel可以猜测的原因。现在我将尝试您建议的修复方法。

如何对Unicode进行编码,以便iPad和Excel都能理解

问题是浏览器知道数据的编码是UTF-8,但它无法告诉Excel。当Excel打开文件时,它将采用系统的默认编码。如果你复制一些非ASCII文本,将其粘贴到记事本中,然后用UTF-8编码保存,你会发现Excel可以正确地检测到它。它在iPad上工作,因为它的默认编码恰好是UTF-8。

原因是Notepad在文件的开头放置了正确的字节顺序标记(对于UTF-8,EF BB BF)。您可以通过使用十六进制编辑器或其他方式创建一个包含的文件来自己尝试

EF BB BF 20 51 75 61 74 74 72 6F 64 65 C2 AE 20

并在Excel中打开该文件。(我使用了Excel2010,但我认为它可以与所有最新版本配合使用。)

请确保您的输出从前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

Excel试图根据文件内容推断编码,ASCII和UTF-8恰好在前128个字符(字母和数字)上重叠。当你使用UTF-16和UTF-32时,它可以发现内容不是ASCII,但由于大多数使用UTF-8的内容都与ASCII匹配,如果你想让文件以UTF-8读取,你必须像Gabe在回答中所说的那样,通过写字节顺序标记来明确地告诉它内容是UTF-8。此外,请参阅Andrew Csontos对另一个问题的回答:

什么';将UTF8数据导出到Excel的最佳方法是什么?

相关文章: