2014-02-20 105 views
0

下面是使用encodeURI編碼/解碼「&」在URL參數

原始字符串一個字符串,我編碼在JavaScript中 - 著作權=版權©2003

這是編碼字符串 - 版權% 20%C2%A9%202003

我通過這個文本鏈接,如www://abc.com?param=Copyright%20%C2%A9%202003,然後打開一個JavaScript彈出窗口。

但是,當我在彈出的頁面中解碼這個字符串,在IE10中它來像「版權所有©2003」那樣跨越Chrome瀏覽器& Firefox它顯示爲「Copyright©2003」。

我知道IE不顯示這個特殊字符©正確,因此我們需要使用"&copy"。但不知何故,我不能發送"&copy"作爲參數,因爲它把"&copy"作爲一個新的參數本身,因爲它與"&"

開始可否請你讓我知道如何正確地進行編碼/使用JavaScript跨越IE正確解碼這個文本。

+1

請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent – elclanrs

+0

一個人通常需要'encodeURIComponent'而不是'encodeURI',例如'&'和'='在URI中是可以的,但是如果你在一個組件中串聯一個字符串,會導致問題,因爲它們可能被解釋爲新參數。 –

+0

我不想編碼「www.abc.com」,而只想編碼參數,這就是爲什麼我使用encodeURI編碼這個。 – Ansuman

回答

0

在您發送的參數(和decodeURIComponent另一端)上使用encodeURIComponent以及適當的元標記(下面是更簡單但仍向下兼容且HTML5友好的方式)和文檔編碼。這將會跳出像&=之類的東西,否則可能會像參數分隔符一樣被對待。

下面是一個IE10和FF27測試演示:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8" /> 
</head> 
<body> 

<script> 

var testString = '\u00a9'; // Show the copyright symbol by default 
       // though you can test with "&" and "=" in here as well 
var loc = window.location.href; 
if (loc.indexOf('param=') === -1) { // Add the param if not present 
    window.location += '?param=' + encodeURIComponent(testString); 
} 

// Show the symbol after the param (in a safe manner). 
document.body.appendChild(document.createTextNode(
    decodeURIComponent(loc.replace(/.*?\?param=/, '')) 
)); 
</script> 

</body> 
</html> 
1

使用HTML實體,如&copy;僅適用於內逸出HTML特殊字符。將它作爲URL的參數發送是沒有用的。

您似乎遇到的問題是,瀏覽器正在使用UTF-8編碼來存儲字符串,並且©字符被存儲爲2字節的序列,在URL中編碼爲%C2%A9。解碼URL的頁面似乎並未使用UTF-8,而是將2個字節解碼爲2個獨立的字符©

只要你不告訴瀏覽器使用哪個字符集,它可以選擇任何它認爲是最好的選擇。 Firefox和Chrome似乎更喜歡UTF-8並正確編碼和解碼字符串。 Internet Explorer 10似乎在每個頁面中選擇了不同的字符集。

你應該確保所有頁面都在HTML頭一個

<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 

標籤。這通常會告訴瀏覽器字符串使用哪個字符集,並且應該通過編碼和解碼URL中的非ASCII字符來解決問題。