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

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 字集建置網站,問題比較少 ( 這好像是廢話. ^^ )

相關連結