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

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

在 [W3C](http://www.w3.org/) 的 [HTML 4.01 Specification](http://www.w3.org/TR/html401/) 規格中有定義 [17.3 The FORM element](http://www.w3.org/TR/html401/interact/forms.html#h-17.3) 可用的屬性(Attribute)，其中有一項 **accept-charset** 屬性用來宣告該表單在送出後伺服器可接受的字集清單，對於 [W3C](http://www.w3.org/) 的規範還是 **非 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 字集建置網站，問題比較少 ( 這好像是廢話. ^^ )

**相關連結**

-   [ACCEPT-CHARSET Attribute | acceptCharset Property](http://msdn.microsoft.com/en-us/library/ms533061\(VS.85\).aspx)
-   [W3C / HTML 4.01 Specification / 17.3 The FORM element](http://www.w3.org/TR/html401/interact/forms.html#h-17.3)
-   [W3Schools.com / HTML <form> accept-charset Attribute](http://www.w3schools.com/TAGS/att_form_accept_charset.asp)
-   [Character Set Recognition](http://msdn.microsoft.com/en-us/library/aa752010\(VS.85\).aspx)
