1. 程式人生 > >好程式設計師web前端教程分享js檔案引用編碼方式

好程式設計師web前端教程分享js檔案引用編碼方式

開發十年,就只剩下這套架構體系了! >>>   

好程式設計師web前端教程分享js檔案引用編碼方式,js外部檔案編碼由這些因素決定:1.如果Apache有DefaultCharset,則js檔案解析用伺服器指定的編碼;2.如果PHP header宣告charset為編碼utf-8,則檔案編碼用utf-8來解析。3.如果以上兩個都為空,頁面編碼由meta標籤決定。4.如果以上宣告都沒有,則會使用utf-8來解析。5.如果頁面編碼為gbk,而js檔案編碼為utf-8,則可以在js屬性中定義charset='utf-8'。

 

昨天幫同事解決的一個問題,GBK的頁面(不要問我為什麼GBK,因為GBK,所以GBK),引用了Google map的API, 但是由於GoogleMap API返回的js指令碼是utf-8的,所以導致在IE下, 瀏覽器無法正確解析.

 

也就是, 由於伺服器中生成的HTML是基於gbk編碼的, 並且由於Apache的DefaultCharset(後敘), 所以導致IE會以gbk編碼去解析從外部引入的GoogleMap js,那肯定是不能正確解釋的.

 

瀏覽器判斷一個頁面的編碼有倆個途徑, 一種是通過HTTP響應頭,

 

HTTP/1.x 200 OK

Date: Sat, 18 Oct 2008 21:53:51 GMT

Server: Apache/2.0.52 (Red Hat)

X-Powered-By: PHP/5.3.0alpha2

Connection: close

Transfer-Encoding: chunked

Content-Type: text/html; charset=GB2312

注意最後一行, 這個是由HTTP頭部指明的頁面編碼格式.

 

另外一種就是我們常見的, 也會另很多初學者困惑的meta:

 

問題就在於,沒有一個統一的標準,來指明這倆中方式的優先順序, 不同的瀏覽器有著不同的優先順序策略.這也就是為什麼,我們在FF下正常瀏覽的頁面,在IE下會亂碼的原因.

 

我之前的文章Apache的Charset設定中已經介紹過了在Apache下設定DefaultCharset以後產生的影響,

 

這個問題已經遇到過倆次了,就是頁面中明確指明瞭編碼是UTF8,但是顯示是亂碼。

 

雖然知道解決方法,也知道是Apache的原因,但是一直沒有去找其所以然,今天趁機,就研究了一下。

 

1. 頁面沒有指定charset , Apache配置defaultcharst gbk , 頁面檔案編碼是utf-8

 

結果: 亂碼,使用wireshark抓包,發現伺服器返回的header中指明瞭:

 

Content-Type:text/html;charset=GBK

結論:當頁面沒有指明charset的時候,Apache的defaultcharset起作用

 

2. 頁面指定charset為utf-8, Apache配置defaultcharset gbk. 頁面檔案是utf-8

 

<head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body>

        <div id="page-header">

         測試Apache DefaultCharset

        </div>

</body>

</html>

結果還是出現亂碼。

 

結論:當Apache配置了DefaultCharset, 將忽略頁面的charset申明。

 

3 PHP header申明charset為utf8, Apache配置defaultcharst gbk,頁面檔案編碼是utf8

 

header("Content-Type:text/html; charset=utf-8");

結果 : 頁面顯示正常。

 

4 Apache設定DefaultCharset off

 

結果,頁面顯示正常。

 

翻閱了下Apache2的手冊:

 

AddDefaultCharset指令

說明當應答內容是text/plain或text/html時,在HTTP應答頭中加入的預設字符集

語法AddDefaultCharsetOn|Off|charset

預設值AddDefaultCharsetOff

作用域serverconfig,virtualhost,directory,.htaccess

覆蓋項FileInfo

狀態核心(C)

模組core

 

當且僅當應答內容是text/plain或text/html時,此指令將會在HTTP應答頭中加入的

預設字符集。理論上這將覆蓋在文件體中通過<meta>標 籤指定的字符集,但是實際

的行為通常取決於使用者瀏覽器的設定。AddDefaultCharsetOff將會禁用此功能。

 

AddDefaultCharsetOn將啟用Apache內部的預設字符集iso-8859-1。您

也可以指定使用在IANA註冊過的字符集名字 中的另外一個charset。

比如說:

AddDefaultCharsetutf-8

也就是說,當Apache不指定defaultcharset的時候,頁面編碼由頁面自己的meta標籤指定。

 

當Apache指定的時候,將忽略頁面中的meta標籤指定的編碼. 但是容許指令碼直接header編碼方式給客戶端

 

最後,還有一個問題沒有得出結果:

 

當Apache和頁面都沒有指定的時候, 又如何?

 

我在自己的機器上,如果都不指定, 預設還是utf8

 

在伺服器端生成response內容以後, 如果指令碼沒有顯示的呼叫header傳送編碼申明,那麼Apache就會根據DefaultCharset生成響應HTTP頭部的Content-type中的charset欄位;

 

反之如果指令碼顯示申明瞭,那麼就會按照指令碼header申明中的charset設定.

 

這樣到了瀏覽器端以後, 瀏覽器就可以根據HTTP頭的charset申明來按照特定的編碼格式解析獲取到的HTML程式碼,但現在的問題是, 頁面是GBK的,但是引用的外部js檔案是utf8編碼的,這樣的情況, 我們可以使用一個script的屬性來解決:

 

  <script language='javascript' src='....'  charset='utf-