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