c# - 如何对 Unicode 进行编码以便 iPad 和 Excel 都能理解?

标签 c# asp.net ipad

我有一个使用 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;
}

<小时/> 更新2 Excel is barfing on UTF8 >:{。男人。我刚刚取消了他列出的第二个选项,因为它在 iPad 上不起作用。输了这一场我就赢不了。

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

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

所以看起来 UTF32 以 32 位进行排列,而 UTF8 以 8 位进行排列。我想这就是Excel可以猜测的原因。现在我将尝试您建议的修复。

最佳答案

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

原因是记事本输入了正确的 byte order mark (UTF-8 的EF BB BF)位于文件的开头。您可以自己尝试使用十六进制编辑器或其他方式创建一个包含的文件

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

关于c# - 如何对 Unicode 进行编码以便 iPad 和 Excel 都能理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6457293/

相关文章:

C# 将字符串 "0"解析为整数

html - 无法加载所有资源 - 错误 500

asp.net - 是否在不安装Windows SDK的情况下安装和使用aspnet_merge.exe?

iphone - 如何在 iPhone SDK 中压缩文件夹?

c# - System.Windows.Forms.WebBrowser 有时会进行 NTLM 验证 - 为什么?

c# - 表达式树 - Math.Max 替换

c# - 我应该学习Java还是应该学习C++?

javascript - 在 Asp.Net MVC 中使用 blueimp 分块上传文件

ios - 命令行 ios 程序

iphone - 如何在 UIPageViewController 中的一页设置文本和另一页的图像