2011-07-13 17 views
10

以下代碼(供應商標準化)完美無缺,在Firefox 8中顯示「➀➁➂測試」,但在Google Chrome中顯示「„」,測試「。有沒有什麼方法可以在Google Chrome中保留blob編碼,而不用使用文件系統API將文件寫入臨時文件系統?在谷歌瀏覽器中指定blob編碼

var bb = new BlobBuilder; 
bb.append("➀➁➂ Test"); 
var b = bb.getBlob("text/plain;charset=UTF-8"); 
var url = URL.createObjectURL(b); 
open(url); 
+0

您是否嘗試過在聲明head標籤編碼? http://tlt.its.psu.edu/suggestions/international/web/tips/declare.html – NoBugs

+0

在生成的文檔中追加一個元素在事實之後沒有做任何事情,並且不可能追加<?xml encoding = ...?>處理對文本/普通文檔的指令,因爲它們生成text/html類型的非XML文檔。即使我可以,我懷疑它會在文檔加載完成後影響文檔的編碼。 –

+0

Firefox 8?那是夜間建造嗎?你有沒有在穩定的Firefox 5中試用過它? – NoBugs

回答

0

問題是Chrome中新選項卡的默認頁面編碼。當新窗口打開時(在window.open(url)之後),從Chrome菜單中選擇查看>編碼> Unicode。在Chrome 13中,我將顯示的文本從「Test,Test」改爲「➀➁➂Test」。

如果您想要一個解決方案,可以讓您在新窗口中打開blob而不管默認編碼如何,那麼您可以依賴於iframe中的文檔在沒有明確指定自己的編碼時會繼承父文檔編碼的事實。因此,您可以使用由Content-Type:text/html; charset=utf-8標頭提供的空白HTML文檔打開窗口,然後將iframe附加到正文,src屬性設置爲blob URL。

10

壁虎(Firefox),WebKit(Safari,Chrome)和Opera支持非標準的btoa函數用於編碼64位的字符串。爲了獲得包含字符串的64位字符串,編碼爲UTF-8,您需要使用encodeURIComponent - unescape詭計。 encodeURIComponent將字符串編碼爲UTF-8 URL,但unescape將每個%xx解碼爲單個字符。 btoa需要一個任何你想要的編碼的二進制字符串。

var base64 = btoa(unescape(encodeURIComponent(data))); 
window.open("data:text/plain;charset=UTF-8;base64,"+base64,"UTF-8 Text"); 

當然這在IE中不起作用,但我認爲IE 10將支持Blob -API。誰知道它將如何處理編碼。

PS:IE似乎不能window.open data:-urls,並且無論如何都會有一個荒謬的小url長度限制。

PPS:這個工作對我來說在Chrome:

var b = new Blob(["➀➁➂ Test"],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"}); 
var url = URL.createObjectURL(b); 
window.open(url,"_blank",""); 
+0

在Chrome 34中,僅當默認編碼(設置/自定義字體/編碼)設置爲「Unicode(UTF-8)」時,此功能纔有效。似乎它目前忽略了「; charset = UTF-8」部分:( – kolypto

+0

@kolypto通過添加編碼選項修正了最後一個代碼示例 – panzi

+0

@kolypto但是對於我來說,它沒有任何選項,我使用Linux和Linux的系統編碼是UTF-8,所以也許Chrome *會忽略這些屬性,並且只是使用系統編碼,對我來說恰好是UTF-8(我認爲我們不應該使用一個不使用UTF-8的OS作爲它的系統編碼無論如何。) – panzi