2011-06-23 51 views
4

我有一個用UTF32編碼的CSV。當我在IE中打開流並使用Excel打開時,我可以讀取所有內容。在iPad上流,我得到一個沒有任何內容的空白頁面。 (我不知道如何在iPad上查看源代碼,以便在HTML中隱藏某些內容)。如何編碼Unicode以便iPad和Excel都能理解?

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上查看源代碼?


UPDATE
我只是做了一個有趣的發現。當我的編碼是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; 
} 


UPDATE2 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可以猜測的原因。現在我會嘗試你的建議修復。

+0

@ P.Brian我認爲,iPad上使用一個類似於谷歌Chrome和Safari瀏覽器。嘗試在PC上測試它們以查看結果。 http://www.apple.com/safari/ – Aristos

+0

@Aristos - 剛剛運行在Safari 5.0.5的桌面在Windows XP上,它工作正常。我沒有Mac,只有iPad。 –

+0

DataGridToCSV的輸出是什麼?字符串?流?字節[]?如果內容的編碼本身不對應,那麼設置Response.ContentEncoding是不夠的 –

回答

7

問題是瀏覽器知道你的數據的編碼是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 
+0

在用HxD打開文件時,前四個十六進制數是'72 00 00 00',我相信它是ASCII/utf8中的字符'r'。我仍然不明白這是如何指定編碼解決問題的解決方案。 –

+0

@ P.Brian:我假設你編碼爲UTF-32時會得到'72 00 00 00',這意味着BOM沒有被插入,Excel只是猜測正確的編碼,因爲文件不會作爲ANSI是沒有意義的。編碼爲UTF-8時,前4個字節是什麼? – Gabe

+0

明天病倒吧 –

2

Excel嘗試根據文件內容來推斷編碼,和ASCII和UTF-8的發生對前128個字符重疊(信件和號)。當你使用UTF-16和UTF-32時,它可以發現內容不是ASCII,但由於你的大部分使用UTF-8的內容都與ASCII相匹配,如果你想讓你的文件以UTF-8的形式被讀入,你必須通過寫出字節順序標記來明確地告訴它內容是UTF-8,正如Gabe在他的回答中所說的那樣。此外,請參閱本等問題Andrew Csontos答案:

What's the best way to export UTF8 data into Excel?

+0

謝謝生病明天 –

+0

物料清單就像一種魅力,比我的原始解決方案簡單得多。你和Gabe都值得信任,但我只能把它交給你們中的一個。多謝你們。 –