The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

關於各瀏覽器對【表單內容送出】的編碼處理補充說明

網友 chihwen 提供了一條關於 瀏覽器對 "表單內容送出" 的編碼處理 的新線索,經我詳細測試下發現各瀏覽器之間的確還是有不同的處理規則,尤其是 IE 瀏覽器對這個屬性的實做不太老實進行了智慧型判斷處理,所以有必要特別說明,請看以下分析。

W3CHTML 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="游錫&#22531; / 許功蓋" /> <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="游錫&#22531; / 許功蓋" /> <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="游錫&#22531; / 許功蓋" /> <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="游錫&#22531; / 許功蓋" /> <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="游錫&#22531; / 許功蓋" /> <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="游錫&#22531; / 許功蓋" /> <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 字集建置網站,問題比較少 ( 這好像是廢話. ^^ )

相關連結