Web開發字符集

2021-05-23 13:10:05 字數 2496 閱讀 2970

本文件旨在說明字符集對於web開發必需掌握的常規應用知識。

對於乙個頁面而言,最核心的三個字符集存在於1,檔案編碼(page encode)2,頁面meta資訊(meta)3,http headers裡的content-type裡的字符集指定(content-type)4,頁面輸出編碼(output encode)

1,  (meta || content-type) === (output encode)

2,  content-type > meta

3,  (output encode) !== || === (page encode)

這裡必需分服務端和客戶端兩塊解釋:

對於服務端而言,伺服器會對於每乙個需要輸出的檔案進行編碼轉換,轉換的編碼是有伺服器廠商提供的可設定的特定值決定(apache是adddefaultcharset,asp.net是web.config的globalization)。這種轉換不會因為輸出檔案字符集和伺服器設定字符集相同而不發生。伺服器設定的字符集最終會體現在http headers的content-type裡(除非人為去掉這個值),用以告訴瀏覽器收到的資料資訊可以用什麼編碼格式顯示。

這裡以gb2312和utf-8舉例,如果乙個原始檔案的編碼格式是gb2312,而伺服器設定的輸出格式是utf-8,那麼他們需要統一轉換到unicode編碼,整個過程是:gb2312->unicode->utf-8,反之依然。

meta是指寫在頁面裡的meta元素指定的字符集資訊,作用和content-type一樣。用以告訴瀏覽器收到的資料資訊以哪種編碼格式顯示。

這裡必需保證的一點是,輸出資料的資料格式,必需和通過content-type或meta指定的編碼格式一致。不然就會造成所謂的「亂碼」情況發生。「亂碼」並不是程式的錯誤,而是瀏覽器被指定了錯誤的顯示方式顯示資料資訊的結果。

以上這段文字所描述的情況僅發生在動態內容上,對於靜態內容,不會經由動態內容對應程式語言的相關的處理模組處理,所以也就不會發生「轉碼」這個行為。或者進一步說,對於動態而言,原始檔案是什麼編碼根本就不重要。重要的輸出編碼和指定編碼是不是對應。那麼對於靜態內容而言,靜態內容本身的字符集就決定了輸出的格式。至於會不會在content-type裡指定charset,則由web server決定。

如果瀏覽器同時收到content-type和meta資訊,以誰為標準?

根據目前測試的結果(firefox3.6.8,chrome7,ie8)來看,首先會滿足content-type設定,如果content-type裡沒有指明charset資訊,才會以meta為準。

那如果content-type和meta都不存在呢?

根據檔案的儲存原則,字符集的資訊被存在了檔案最前面的幾個位元組裡,而伺服器在傳送資料的時候,這部分資訊是不會傳送出去的。這樣瀏覽器在沒有收到任何字符集指令的時候就無法「確認」自己究竟該怎麼辦。於是瀏覽器會嘗試進行以下行為:先快取一部分位元組(快取多少視不同瀏覽器而定),然後去「猜測」這部分位元組究竟是什麼字符集,找乙個瀏覽器認為最為匹配的字符集進行顯示,所以任何資訊傳送給瀏覽器,瀏覽器都會將其顯示出來,至於顯示的結果是不是符合要求,瀏覽器就不得而知了。

下**釋了不同瀏覽器快取位元組的大小: 

bytes buffered

configuration

firefox 3.5

chrome 3.0

ie 8

tranfer-encoding: chunked

1134

1056

300

content-type: text/html

tranfer-encoding: chunked

204

1056

341

content-type: text/html

166

204

218

content-type:text/html; charset=utf-8

tranfer-encoding: chunked

204

280

300

那如果沒有content-type設定,而且meta的設定位置超過瀏覽器快取大小呢?

這裡瀏覽器會進行這樣的處理:首先嘗試「猜測」,找到他認為符合的字符集,等頁面載入到一定程度並且載入到meta資訊時,瀏覽器發現字符集有指定,於是瀏覽器會清空快取,將資料重新進行轉碼處理,也就是所謂的全部重新渲染。部分情況下,對於某些資源,瀏覽器還會重新進行請求。(某些資源是指資源中含有中文)

這是因為對於動態資源而言,伺服器必然會對資源進行轉碼,而無視資源本身的編碼格式,所以對於任何伺服器端存在的動態資源來說,格式並不一定要和伺服器輸出的格式相同。因為無論怎樣,服務端都會進行編碼輸出。靜態資源輸出的就是它本身的編碼格式。

對於web開發而言,了解字符集的概念應用可以有助於進行部分的效能優化。這裡google code給出了他們的4個建議:

1,  指定content-type和meta資訊。

2,  meta的定義盡可能靠前部(head之後的第二行)

3,  始終確保定義了字符集。

4,  保證設定的字符集是正確的。

WEB開發中的字符集和編碼

我相信很多人在初接觸程式設計時,都被字符集狠狠地虐過,特別是資料庫的中文亂碼問題,那麼亂碼是怎麼產生的呢?我們都知道計算機是以二進位制儲存和執行的,那麼它是怎麼把二進位制資料轉換為各種文字的呢?還有我們常用的各種字符集,常用的編碼轉換,都是怎麼進行的呢?本博文所寫的內容不是技術乾貨,只是對我們常用的...

mysql api 字符集 MySQL字符集

mysql字符集包括字符集 character 和 collation 兩個概念。字符集是用來定義mysql儲存字串的規則,校對規則則是定義了比較字串的方式。字串和校對規則是一對多的 關係。使用命令 show collation like gbk 可檢視相關的校對規則 使用 show charact...

Unicode字符集和多字符集

由於各國語言的加入,ascii已經不能滿足資訊交流的需要,因此,為了能夠表示其它國家的文字,各國在ascii的基礎上制定了自己的字符集,它們正式的名稱應該是mbcs multi byte chactacter system,即多位元組字元系統 型別說明 unicode ansi 通用型別 字元wch...