Web拾遗--字符集的困扰?
問題?
進行web開發的時候,經常會遇到字符集的問題。此類問題非常的棘手和討厭。如果處理不當,可能永遠無法搞清楚究竟發生了什么。
拾遺!
本文檔旨在說明字符集對于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)
以下逐一解釋這些關系:
1,(Meta || Content-Type) === (Output 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決定。
2,Content-Type > Meta
如果瀏覽器同時收到Content-Type和Meta信息,以誰為標準?
根據目前測試的結果(FireFox3.6.8,Chrome7,IE8)來看,首先會滿足Content-Type設定,如果Content-Type里沒有指明charset信息,才會以Meta為準。
?
那如果Content-Type和Meta都不存在呢?
?
根據文件的存儲原則,字符集的信息被存在了文件最前面的幾個字節里,而服務器在發送數據的時候,這部分信息是不會發送出去的。這樣瀏覽器在沒有收到任何字符集指令的時候就無法“確認”自己究竟該怎么辦。于是瀏覽器會嘗試進行以下行為:先緩存一部分字節(緩存多少視不同瀏覽器而定),然后去“猜測”這部分字節究竟是什么字符集,找一個瀏覽器認為最為匹配的字符集進行顯示,所以任何信息發送給瀏覽器,瀏覽器都會將其顯示出來,至于顯示的結果是不是符合要求,瀏覽器就不得而知了。
?
下圖解釋了不同瀏覽器緩存字節的大小:?
| Configuration | FireFox 3.5 | Chrome 3.0 | IE 8 |
| Tranfer-Encoding: chunked ? | 1134 | 1056 | 300 |
| Content-Type: text/html | 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信息時,瀏覽器發現字符集有指定,于是瀏覽器會清空緩存,將數據重新進行轉碼處理,也就是所謂的全部重新渲染。部分情況下,對于某些資源,瀏覽器還會重新進行請求。(某些資源是指資源中含有中文)
3,(Output Encode) !== || === (Page Encode)
這是因為對于動態資源而言,服務器必然會對資源進行轉碼,而無視資源本身的編碼格式,所以對于任何服務器端存在的動態資源來說,格式并不一定要和服務器輸出的格式相同。因為無論怎樣,服務端都會進行編碼輸出。靜態資源輸出的就是它本身的編碼格式。
?
字符集的積極意義?
?
對于web開發而言,了解字符集的概念應用可以有助于進行部分的性能優化。這里Google Code給出了他們的4個建議:
1,? 指定Content-Type和Meta信息。
2,? Meta的定義盡可能靠前部(Head之后的第二行)
3,? 始終確保定義了字符集。
4,? 保證設定的字符集是正確的。
轉載于:https://www.cnblogs.com/gantianamin2001/archive/2010/09/29/Web.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Web拾遗--字符集的困扰?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工具 - MyEclipse算法机最新8
- 下一篇: 物理学——物理引擎