2010-04-09 74 views
0

我認爲在表單中輸入的值是由瀏覽器正確編碼的。JS encodeURIComponent結果與FORM創建的結果不同

但是這個簡單的測試文件 「test_get_vs_encodeuri.html」 顯示事實並非如此:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html><head> 
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> 
    <title></title> 
</head><body> 

<form id="test" action="test_get_vs_encodeuri.html" method="GET" onsubmit="alert(encodeURIComponent(this.one.value));"> 
    <input name="one" type="text" value="Euro-€"> 
    <input type="submit" value="SUBMIT"> 
</form> 

</body></html> 

當點擊提交按鈕:

encodeURICompenent編碼輸入值成了「歐洲 - %E2%82%AC 「

,而瀏覽器進入GET查詢只寫一個簡單的 」歐洲 - %80「

  1. 有人可以解釋一下嗎?

  2. 我如何編碼一切以borwser的形式(windows-1252)使用Javascript的相同方式?(轉義函數不起作用,encodeURIComponent也不起作用)?

或者encodeURIComponent做不必要的轉換?

回答

5

這是一個字符編碼問題。您的文檔正在使用字符集Windows-1252,其中位於128位,它使用Windows-1252編碼爲0x80。但是encodeURICompenent期望輸入爲UTF-8,因此使用Unicode字符集,其中位於使用UTF-8 0xE282AC編碼的位置8364(PDF)。

解決方案也是使用UTF-8編輯文檔。或者你編寫一個將UTF-8編碼的字符串轉換爲Windows-1252的映射。

+0

@Gumbo:謝謝我現在明白了。但是這讓我想到另一個問題,我已經問過,這個該死的encodeURIComponent是有用的嗎?我的意思是即使我使用cp1252,FORM編碼的值也不會錯,那麼爲什麼我應該使用這個該死的encodeURIComponent來編碼URI,我不能使用一個簡單的JS轉義函數來返回與編碼相同的值由表格。我知道這可能不是很好,但最終我更喜歡像瀏覽器的FORM那樣編碼東西。 http://stackoverflow.com/questions/2238515/encodeuricomponent-is-really-useful – 2010-04-11 10:24:11

+0

@Marco Demaio:'escape'有不同的格式:'escape(「€」)===「%u20AC」'。至於「encodeURIComponent」的用途:想象一下你想要建立一個包含'&'值的URI(比如'bar&baz')。 '「...?foo = bar&baz」'會產生兩個參數(* foo *和* baz *),因爲'&'是一個特殊字符。但''...?foo =「+ encodeURIComponent(」bar&baz「)'會做到這一點。 – Gumbo 2010-04-11 10:50:13

+0

對不起,我沒有正確解釋,我說了垃圾,我知道我必須在GET組件中編碼字符'&',但是如何以與使用JS的cp1252相同的FORM方式編碼一切?使用轉義不是方法,但使用encodeURICompoenent不是因爲€編碼不同。 JS有沒有任何功能可以做到這一點?對不起,我也更新了這個問題。 – 2010-04-11 11:06:03

0

我認爲問題的根源在於字符編碼。如果我勾搭元標記字符集和保存不同編碼的文件,我可以得到的頁面這樣在瀏覽器中呈現:

Content encoding issue http://www.boogdesign.com/examples/encode/content-encoding-issue.png

€看起來很像你在說什麼來自encodeURIComponent。但是,我發現沒有任何編碼組合對encodeURIComponent返回的內容產生任何影響。我可以改變GET查詢返回的內容。 This is your original page,提交給像一個網址:

test-get-vs-encodeuri.html?one=Euro-%80 

This is a UTF-8 version of the page,提交給了看起來像這樣(在Firefox)的網址:

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-€ 

但是,如果我複製並粘貼我得到:

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-%E2%82%AC 

因此,它看起來像頁面是UTF-8,然後GET和encodeURIComponent匹配。

+0

encodeURIComponent始終採用UTF-8。來自http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf:15.1.3。4 \t encodeURIComponent(uriComponent) encodeURIComponent函數計算URI的新版本,其中某些字符的每個實例都由表示該字符的UTF-8編碼的一個,兩個或三個轉義序列替換。 – 2010-09-28 00:34:09