2011-11-10 49 views
0

我使用這個腳本(從動態駕駛)來動態填充的div id爲:的XMLHttpRequest顯示eurosign作爲問號

var bustcachevar=1 //bust potential caching of external pages after initial request? (1=yes, 0=no) 
    var loadedobjects="" 
    var rootdomain="http://"+window.location.hostname 
    var bustcacheparameter="" 

    function ajaxpage(url, containerid){ 
     var page_request = false 
     if (window.XMLHttpRequest) // if Mozilla, Safari etc 
     page_request = new XMLHttpRequest(); 
     else if (window.ActiveXObject){ // if IE 
      try { 
       page_request = new ActiveXObject("Msxml2.XMLHTTP"); 
       } 
      catch (e){ 
       try{ 
        page_request = new ActiveXObject("Microsoft.XMLHTTP"); 
        } 
       catch (e){} 
      } 
     } 
     else 
     return false 
     page_request.onreadystatechange=function(){ 
      loadpage(page_request, containerid) 
     } 

     if (bustcachevar) //if bust caching of external page 
     bustcacheparameter=(url.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime() 
     page_request.open('GET', url+bustcacheparameter, true) 
     page_request.send(null) 
    } 

    function loadpage(page_request, containerid){ 
     if (page_request.readyState == 4 && (page_request.status==200 || window.location.href.indexOf("http")==-1)) 
     document.getElementById(containerid).innerHTML=page_request.responseText 
    } 

一切工作正常,直到我打開一個頁面,例如在它eurosign。 代碼頁在頁面上設置正確,但它顯示一個問號。 我不知道足夠的JavaScript來解決這個問題。

在此先感謝您的任何建議!

注意:感謝朋友,我現在知道使用UTF-8使用此腳本保存要加載的文件可修復此問題。但我不能確定我加載的每一頁都是UTF-8編碼,因此我的問題是:

有沒有腳本設置正確字符集的方法?有沒有辦法讓腳本適應你想要加載的文件的代碼頁?

+0

我看不出它是如何成爲一個JavaScript問題。很可能,您在兩個文檔,服務器端AJAX腳本和目標HTML文檔(或可能依賴於默認編碼)中使用不同的編碼。 –

回答

0

看來你有一個編碼問題的地方。

我強烈建議你到處使用UTF-8,因爲它是網絡的既定標準。檢查執行ajax調用的頁面和動態加載的頁面是否以UTF-8編碼並由服務器發送正確的標題(標題應包含類似於Content-type: text/html; charset=UTF-8的內容)。

此外,最好的做法是用html頁面中的html代碼替換外來字符以避免出現此類問題。使用€作爲€。

+0

感謝您的回覆。我知道這些標準,正如我在我的問題中指出的那樣,編碼源文件確實解決了問題。有沒有辦法讓JavaScript設置編碼或更改/適應正在讀取的文件?發生問題時,該文件曾被ANSI編碼而不是UTF-8。我希望能夠以不同的字符集加載頁面,因爲我不是唯一一個上傳可以動態加載的文件的頁面。用戶可能不知道如何將文件保存爲UTF-8,並且他們不應該關心(因爲您必須假設用戶是愚蠢的)。 –

+0

您是否建議使用UTF-8並同時避免使用非ASCII字符? –

+0

@ÁlvaroG. Vicario否:)我知道如果沒有非ASCII字符,我們並不關心編碼... –

0

這是我的假設(我認爲它已經被你的更新確認):

  • 當你寫你加載遠程文檔,你只要打開你的編輯器,打€符號鍵盤並保存。由於您從未選擇任何編碼,因此您的編輯器使用ANSI代碼頁。這裏的問題是:ANSI代碼頁基本上取決於你住的地方。在西歐,Win-1252是一種流行的選擇,並將歐元符號編碼爲0x80

  • 當你想要插入目標HTML文檔的時候,你可以做同樣的事情並獲得一個Win-1252文檔。但是,網絡服務器不知道編碼是什麼。很多時候,它會默認爲ISO-8859-1之類的東西,而且ISO-8859-1甚至沒有歐元符號!

  • JavaScript讀取0x80並寫入0x80

  • 瀏覽器在假定爲ISO-8859-1的HTML文檔中發現0x80。在這種編碼中,0x80實際上是空白的。

所以你不必修復你的JavaScript代碼(這裏沒有任何可修復的東西,主要是因爲沒有錯誤)。你需要找出你的網站的編碼是什麼,並生成實際使用這種編碼的文件(高級編輯會讓你選擇)。

+0

嗨,感謝您的回覆。它恰好就是這樣發生的。即使當我在index.php中指定我想讓ISO-8859-15(具有歐元符號)或WIN-1252時,我仍然會得到問號而不是歐元符號。這意味着我用什麼代碼頁來設置我的index.php文件並不重要。這一切都取決於我使用的JavaScript文件加載使用的編碼。比如,假設某人上傳了一個錯誤的基於charcode的文件到我的服務器上,並用這個腳本加載它,有沒有辦法正確地檢查我的代碼頁並以某種方式「轉換」它? –

+0

沒有100%可靠的方法來檢測由隨機用戶上傳的一些任意文本文件的編碼。你爲什麼不簡單地用textarea建立一個上傳特徵? –