Quantcast
Channel: 香港網頁開發網誌 » HTML
Viewing all articles
Browse latest Browse all 8

如何設定網頁的 charset?

$
0
0

我們都知道每一個網頁都必須設定 charset 才能在瀏覽器上正確顯示文字,例如一個中文網頁使用 Big5 編碼,瀏覽器卻把它當成 UTF-8 來顯示,毫無疑問結果就是一堆亂碼。究竟瀏覽器是怎樣決定一個網頁的編碼?HTML4 和 HTML5 對此是否有規定?開發人員有什麼需要注意?

HTML4 決定網頁編碼的法則

根據 HTML 4.01 的規格文件第 5.2.2 段,瀏覽器應根據以下的優先次序決定網頁的編碼:

  1. HTTP 標頭中 Content-type 的 charset 參數,例如:
    Content-Type: text/html; charset=utf-8
  2. 網頁中的 meta 標籤,其中 http-equiv 是 Content-Type,並且設定了 charset 的值,例如:
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  3. 網頁中指定外部資源時設定的 charset 值。

若果以上方法皆無法決定網頁的編碼,瀏覽器可以嘗試猜度,或者使用用家指定的編碼。規格文件特別強調,瀏覽器絕對不應有預設的編碼,即使「上窮碧落下黃泉」仍然毫無頭緒,也不能硬塞一個預設的編碼給網頁,這可真為難了瀏覽器的開發人員,因為規格文件沒有規定網站伺服器或網頁必須要設定 charset,而事實上互聯網上有數不清非 ASCII 網頁沒有設定 charset。

HTML5 決定網頁編碼的法則

先旨聲明,本文執筆之時 HTML5 仍未正式成為官方規格(儘管互聯網上對它的討論鬧得沸沸揚揚,似乎它已經成為定案),它現在的身份是 candidate recommendation,預算在 2014 年才成為官方規格。

HTML 5 的規格文件第 8.2.2.1 段詳細解釋瀏覽器應該怎樣決定網頁的編碼,由於內容極度冗長細緻(作為規格文件這是應該的),我把決定編碼的優先次序簡化如下:

  1. 使用用家指定的編碼。
  2. 使用網頁開頭的 Byte Order Markers (BOMs) 來決定,這可以分辨出 big-endian UTF-16, little-endian UTF-16, 和 UTF-8。
  3. 使用 HTTP 標頭中的 charset 設定。
  4. 嘗試掃瞄網頁尋找蛛絲馬跡,包括尋找網頁中的 meta 標籤,其中 http-equiv 是 Content-Type,並且設定了 charset 的值。

若果這是仍然無法判斷編碼,規格文件也建議了一些可行的猜度方法。最後,它容許瀏覽器有預設的編碼,在無法可施的時候使用。

此外,規格文件第 4.2.5.5 段對於怎樣設定編碼有以下規定:

  1. 若果一個網頁沒有 BOM,HTTP 標頭又沒有設定編碼,開發人員便必須在網頁內使用 meta 標籤來設定。
  2. 每一個網頁最多只可以有一個設定編碼的 meta 標籤。
  3. 整個 meta 標籤必須在網頁開頭的 1,024 bytes 之內。

給開發人員的建議

HTML 5 規格文件建議開發人員使用 UTF-8,這是理所當然的,任何新的專案都應該使用萬國碼 (Unicode) 來開發,在萬國碼芸芸眾多的編碼方式中,UTF-8 是最適合用於互聯網,特別是網頁,因為它是一種與 ASCII 兼容的文字編碼方案。

若果你有設定網站伺服器的權限,不妨把 HTTP 標頭中的 charset 設定為 UTF-8,這樣即使網站開發人員忘記了在網頁內設定 meta 標籤,或者把 meta 標籤搞亂了,也不會有任何影響。

否則的話,你必須在所有網頁開頭的 1,024 bytes 之內,使用 meta 標簽設定編碼。

BOM 又如何呢?HTML 5 的規格說它比 HTTP 頭標更優先,對開發人員來說不是更方便更有彈性嗎?BOM 有兩個問題,首先它只能用來分辨兩種 UTF-16 和 UTF-8,對於其他萬國碼的編碼例如 UCS-16,UTF-7,UTF-32 等等均不能使用。第二,UTF-8 的官方規格文件 RFC 3629 第六章明確表示,在 UTF-8 文件的開頭放入 BOM 是完全沒有必要的(雖然也無害),在可能的情況下也不應該放入 BOM,規格文件同時列出一些放入 BOM 的壞處,及在什麼特殊情況下才可使用 BOM,總之可以的話,也不要在 UTF-8 文件的開頭放入 BOM。第三,有些文本編輯器會自動在 UTF-8 文件的開頭加入 BOM(例如視窗上的記事本),有些則(正確地)不會,這方面的操作沒有標準,由於 BOM 不是可見字符,很多開發人員不知道自己使用的編輯器會否加入 BOM,或者如何指令它加入/不加入 BOM,甚至怎樣檢查一份文件是否包含 BOM,所以某程度上這不是開發人員所能控制的。總的來說,我不建議開發人員使用 BOM,或者依賴它來設定網頁的編碼。

任何時候,你都要確保每一個網頁都明確設定了編碼,不要讓瀏覽器自行猜度,天知道他們怎樣猜度,萬一搞錯了以至用家看到一堆亂碼,被罵的肯定是你而不是瀏覽器。


Viewing all articles
Browse latest Browse all 8

Latest Images

Trending Articles





Latest Images