網友 chihwen 提供了一條關於 瀏覽器對 "表單內容送出" 的編碼處理 的新線索,經我詳細測試下發現各瀏覽器之間的確還是有不同的處理規則,尤其是 IE 瀏覽器對這個屬性的實做不太老實進行了智慧型判斷處理,所以有必要特別說明,請看以下分析。
在 W3C 的 HTML 4.01 Specification 規格中有定義 17.3 The FORM element 可用的屬性(Attribute),其中有一項 accept-charset 屬性用來宣告該表單在送出後伺服器可接受的字集清單,對於 W3C 的規範還是 非 IE 瀏覽器 比較乖乖的實做,而 IE 又是與眾不同的內建「智慧型」字集判斷機制,我個人認為這實在是畫蛇添足,又是另一則芭蕉事件… = =’’
我簡單做了 10 個測試案例,用來測試每個瀏覽器對 accept-charset 屬性的支援程度:
1. 從 BIG5 網頁 Post 到 BIG5 網頁,表單設定 accept-charset="big5"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="big5">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- IE / Firefox / Chrome 都會將 Form 欄位以 Big5 字集編碼後送出,遇到無法編碼的會以 HTML Entities 表示
2. 從 BIG5 網頁 Post 到 GB2312 網頁,表單設定 accept-charset="gb2312"
<form method="post" action="TEST/PrintQueryStringGB.asp?name=測試" accept-charset="gb2312">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- Firefox / Chrome 都會將 Form 欄位以 GB2312 字集編碼後送出,遇到無法編碼的會以 HTML Entities 表示
- IE 瀏覽器依然以 BIG5 編碼送出
3. 從 BIG5 網頁 Post 到 BIG5 網頁,表單設定 accept-charset="utf-8"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="utf-8">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- IE / Firefox / Chrome 都會將 Form 欄位以 UTF-8 字集編碼後送出
4. 從 BIG5 網頁 Post 到 UTF-8 網頁,表單設定 accept-charset="big5"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="big5">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- IE / Firefox / Chrome 都會將 Form 欄位以 Big5 字集編碼後送出,遇到無法編碼的會以 HTML Entities 表示
5. 從 BIG5 網頁 Post 到 UTF-8 網頁,表單設定 accept-charset="utf-8"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="utf-8">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- IE / Firefox / Chrome 都會將 Form 欄位以 UTF-8 字集編碼後送出
---
目前為止 IE 都還挺乖的,再看看以下 4 個測試案例。
---
6. 從 UTF-8 網頁 Post 到 BIG5 網頁,表單設定 accept-charset="big5"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="big5">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- Firefox / Chrome 都會將 Form 欄位以 Big5 字集編碼後送出,遇到無法編碼的會以 HTML Entities 表示
- IE 瀏覽器會還是會依照頁面編碼的定義送出 UTF-8 字集編碼的資料
7. 從 UTF-8 網頁 Post 到 GB2312 網頁,表單設定 accept-charset="gb2312"
<form method="post" action="TEST/PrintQueryStringGB.asp?name=測試" accept-charset="gb2312">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- Firefox / Chrome 都會將 Form 欄位以 GB2312 字集編碼後送出,遇到無法編碼的會以 HTML Entities 表示
- IE 瀏覽器依然以 UTF-8 編碼送出
8. 從 UTF-8 網頁 Post 到 BIG5 網頁,表單設定 accept-charset="utf-8"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="utf-8">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- IE / Firefox / Chrome 都會將 Form 欄位以 UTF-8 字集編碼後送出
9. 從 UTF-8 網頁 Post 到 UTF-8 網頁,表單設定 accept-charset="big5"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="big5">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- IE / Firefox / Chrome 都會將 Form 欄位以 Big5 字集編碼後送出,遇到無法編碼的會以 HTML Entities 表示
- IE 瀏覽器會還是會依照頁面編碼的定義送出 UTF-8 字集編碼的資料
10. 從 UTF-8 網頁 Post 到 UTF-8 網頁,表單設定 accept-charset="utf-8"
<form method="post" action="TEST/PrintQueryStringU8.asp?name=測試" accept-charset="utf-8">
Text: <input type="text" name="key" value="游錫堃 / 許功蓋" /> <input type="submit" />
</form>
結果:
- IE / Firefox / Chrome 都會將 Form 欄位以 UTF-8 字集編碼後送出
---
簡言之,可總結如下規則:
- Internet Explorer 瀏覽器不允許從 UTF-8 頁面發出非 UTF-8 的編碼的 HTTP Request 到 Server 端
- Internet Explorer 瀏覽器在非 UTF-8 的編碼的頁面只能指定「與頁面相同字集」的字集以及「UTF-8 字集」,否則都會以「與頁面相同字集」編碼後送出
- Firefox / Chrome 瀏覽器都會照實以 FORM 元素中 accept-charset 屬性指定的字集編碼後送出
- Firefox / Chrome 所發出的 HTTP Request 中,會比 IE 多一個 Accept-Charset 標頭,不過這與 FORM 的 accept-charset 無關。
最後建議:
- 盡量以 UTF-8 字集建置網站,問題比較少 ( 這好像是廢話. ^^ )
相關連結