2010-04-12 51 views
1

我有一個JavaScript文件,很多人都嵌入到他們的頁面。由於我託管該文件,因此我可以控制該JavaScript文件;我無法控制它的嵌入方式,因爲很多人已經在使用它。如何使用JavaScript中的相同編碼發送參數?

這個JavaScript文件發送GET請求我的servlet和與請求傳遞的參數被記錄到數據庫。例如,javascript向http://myserver.com/servlet?p1=123&p2=aString發送請求,然後servlet以某種方式將123aString記錄到DB。

之前發送的字符串我用encodeURIComponent()來編碼。但是我發現每個客戶都使用不同的編碼發送相同的字符串,具體取決於他們的瀏覽器或他們正在訪問的網站。結果,相同的字符串在到達servlet時用不同的字符表示(所以它們是不同的字符串)。

我所試圖做的是字符串從JavaScript轉換爲一種編碼的,所以當他們到達客戶端同樣的話用相同的字符表示。

這怎麼可能?

PS。如果有辦法從Java轉換編碼,它也適用。

編輯:更確切地說,我從頁面中選擇一些單詞並將其發送到服務器。這是編碼導致問題的地方。

編輯2:我不發送(並且不能發送)通過XMLHttpRequest的GET請求,因爲域是不同的。我正在使用@streetpc提到的將script標記添加到head方法。

編輯3:在我消毒通過JavaScript端取代非ASCII字符的字符串的時刻,但我有一種感覺,這是不是要走的路:

function sanitize(word) { 
    /* 
    ğ : \u011f 
    ü : \u00fc 
    ş : \u015f 
    ö : \u00f6 
    ç : \u00e7 
    ı : \u0131 
    û : \u00fb 
    */ 
    return encodeURIComponent(
      word.replace(/\u011f/g, '_g') 
       .replace(/\u00fc/g, '_u') 
       .replace(/\u00fb/g, '_u') 
       .replace(/\u015f/g, '_s') 
       .replace(/\u00f6/g, '_o') 
       .replace(/\u00e7/g, '_c') 
       .replace(/\u0131/g, '_i')); 
} 

回答

2

你在HTTP頭文件中指定JavaScript文件的編碼?像Content-type: text/javascript; charset=utf-8一樣,.js文件當然是以UTF-8保存。與Apache,您可以配置

AddCharset utf-8 .js 

或者你可以使託管的JavaScript文件中創建另一個script標籤與charset='utf-8'參數和添加它到head元素(最喜歡做的bookmarklet)。

我想的JavaScript解釋爲UTF-8編碼,然後應該得到/處理UTF-8字符串。

然後,在你的Java Servlet,您可以指定輸入編碼使用:

request.setCharacterEncoding("UTF-8"); 

編輯:查看此網頁約Character Encoding in JavaScript,尤其是名爲「設置字符編碼」的一部分。

3

我想通了,是每一個客戶端發送相同字符串不同編碼

雖然這會爲<form>意見是正常的,它不應該發生的XMLHttpRequest的工作。明確地,encodeURIComponent函數總是寫入URL編碼的UTF-8字節,而不管使用它的頁面的編碼如何。當然說服你的servlet容器允許你閱讀那些UTF-8字節而不會搞亂它們是另一回事,但這不應該取決於客戶端。

如果您在腳本文件本身內使用原始非ASCII字符,可能會出現問題。在這種情況下,這些字符的解釋將根據瀏覽器用於加載腳本的字符集而變化。這可能會受到以下影響:

  1. 任何在Content-Type: text/javascript;charset=標頭中聲明的字符集。
  2. 任何在<script src="..." charset="...">元素上聲明的charset屬性。
  3. 包含該腳本的頁面的字符集。

(1)和(2)在所有瀏覽器中都不受支持。通常情況下,您可以依靠(3),但作爲第三方腳本作者,您無法控制。因此,您應該只在腳本中使用ASCII字符。 (使用\u1234轉義以在腳本中包含字符串文字中的非ASCII字符以解決此限制。)

+0

我正在使用非ASCII字符,這就是爲什麼我遇到問題。 – nimcap 2010-04-12 14:30:28

+0

您在返回的'.js'中使用文字,原始非ASCII字符?如果是這樣,您將需要對它們進行編碼,以便它們僅適用於ASCII。對於字符串文字來說,這很容易,如上所述。 (我想不出你需要字符串以外的非ASCII字符的原因。) – bobince 2010-04-12 14:32:02

+0

我更新了我的問題,使其更加清晰,我使用非ASCII字符但不直接在JS中。我從頁面中獲取它們,通常包含非ASCII字符。 – nimcap 2010-04-12 14:50:03

相關問題