好程序員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'。javascript

 

昨天幫同事解決的一個問題,GBK的頁面(不要問我爲何GBK,由於GBK,因此GBK),引用了Google map的API, 可是因爲GoogleMap API返回的js腳本是utf-8的,因此致使在IE下, 瀏覽器沒法正確解析.html

 

也就是, 因爲服務器中生成的HTML是基於gbk編碼的, 而且因爲Apache的DefaultCharset(後敘), 因此致使IE會以gbk編碼去解析從外部引入的GoogleMap js,那確定是不能正確解釋的.前端

 

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

 

HTTP/1.x 200 OK程序員

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

Server: Apache/2.0.52 (Red Hat)瀏覽器

X-Powered-By: PHP/5.3.0alpha2服務器

Connection: close測試

Transfer-Encoding: chunkedui

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-8'></script>

相關文章
相關標籤/搜索