用 xhr 抓 text/html 時的預設編碼

由於一般瀏覽時候判斷 HTML 編碼的規則非常的...瘋狂(比如說還有重讀的情況
[1]),上個月 Web Applications 工作組 Mozilla 的約聘工程師 Henri
Sivonen(Mozilla HTML5 解析器的實作者)提出 XHR2[2] 在碰到 text/html 文
件時,xhr.responseXML (XHR1 的 responseXML 不支援 text/html)應該了一套
簡單版的決定編碼規則。具體來說大部分都還好,問題在於這個簡單版的決定編碼
規則最後的預設編碼,在沒有

* HTTP Content-Type
* BOM
* <meta>

[1]
http://www.w3.org/html/ig/zh/wiki/HTML5#.E8.A7.A3.E6.9E.90.E6.99.82.E7.9A.84.E7.B7.A8.E7.A2.BC.E8.AE.8A.E6.9B.B4
第四步
[2]
http://lists.w3.org/Archives/Public/public-webapps/2011JulSep/thread#msg1562

的情況下會變成 UTF-8,而不是一般正常瀏覽的時候因不同語言環境有不同預設值
(zh-TW 為 Big5,zh-CN 為 GB18030)。基本上大家有 responseText 跟
responseXML 應該用同樣判斷編碼規則的共識,但是同樣是 Mozilla 工程師的
Jonas Sicking 擔心這樣做會破壞向後兼容性,特別是 CJK 的環境,不過沒得到
什麼共鳴。HTML 規範也已經有一個 bug 在那裡了[3],HTML 規範改了之後 XHR2
的規範也會因此改變[4]。

XHR 預設編碼為 UTF-8 的好處:
* 不會再有因不同語言環境,有的瀏覽器出現亂碼有的不出現亂碼的恐怖情形。
* Gecko 的 responseText 的預設早已是 UTF-8(其他瀏覽器尚為了解,有請高人
指點),以後改用 responseXML(或 response)不會有兼容問題。

壞處:
* 在不能更改舊有內容的 HTTP Content-Type 或是 <meta> 的情況下,假如說你
想弄一個新的 AJAX 的東西,如果不知道 xhr.overrideMimeType() 的話會得到亂
碼。而且在有些內容用 UTF-8 有些不是的情況下,overrideMimeType 也不一定好
寫(可能會不小心把 UTF-8 蓋掉成 Big5 之類的)

大家覺得呢,有人反對預設編碼改成 UTF-8 的嗎?

[3] http://www.w3.org/Bugs/Public/show_bug.cgi?id=14284
[4]
http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#text-response-entity-body

補充一下,Henri Sivonen 的提案是不用[5]的第 6, 7, 8 步,另外就是永遠不會
進入「變更編碼」的步驟(所以不會有 XHR 還讀兩次的可怕情形)。

[5]
http://www.w3.org/html/ig/zh/wiki/HTML5#.E6.B1.BA.E5.AE.9A.E5.AD.97.E7.AC.A6.E7.B7.A8.E7.A2.BC
[6] http://www.w3.org/html/ig/zh/wiki/HTML5#change-the-encoding


此致

呂 康豪(Kenny), 中文興趣小組W3C連絡人
Google+: https://plus.google.com/112088462407783855918/posts
新浪微博: http://t.sina.com.cn/1950042164

Received on Thursday, 27 October 2011 11:16:46 UTC