2011-06-07 42 views
4

我正在用不同的語言編寫我自己的函數,並且我希望它在可能的情況下提供相同的結果。JavaScript:什麼字符不是由encodeURIComponent編碼的?

+3

之一)而現在的明顯的問題是:你爲什麼不能使用'encodeURIComponent'本身? – 2011-06-07 14:09:02

+0

*「我正在編寫一個函數,它的行爲與原生函數的行爲完全一樣」*乞求該問題...... – 2011-06-07 14:22:55

+0

@Felix:我正在編寫的內容不在JavaScript中。它適用於Java和Perl。我想要獨立的子程序,所以這可以在沒有任何庫需要的情況下工作。我也想確保它與JavaScript等價物相同。 – 2011-06-07 16:58:21

回答

7

您可以找到MDC documentation信息:

encodeURIComponent轉義的所有字符,除了以下內容:
字母,十進制數字,- _ . ! ~ * ' ()

3

簡短的回答,您可以匹配所有UTF-16代碼單元encodeURIComponent將使用以下編碼:

/[^a-zA-Z0-9\-_.!~*'()]/g 

雖然,規範說它處理補充代碼點與4字節的UTF-8編碼。

龍答案,ES 262說

15.1.3.4 encodeURIComponent方法(uriComponent)

encodeURIComponent函數計算,其中某些字符的每個實例由一個取代了URI的新版本中,兩個,三個或四個表示字符的UTF-8編碼的轉義序列。 當encodeURIComponent函數被調用,一個參數uriComponent,採取以下步驟:

  1. 讓componentString是的ToString(uriComponent)。

  2. 設unescapedURIComponentSet是包含每一個字符在有效 uriUnescaped的一個實例的字符串。

  3. 返回調用

而uriUnescaped由此定義

uriUnescaped ::: uriAlpha編碼(componentString,unescapedURIComponentSet)的結果| DecimalDigit | uriMark

其中

uriAlpha ::: A B C d E F G H I J K L M N 2 O p q - [R式T U,V,的1瓦特X Y Z A B C d E F G H I J K L M N 2 O P Qř式T U V W X YŽ

uriMark :::之一 - _。 ! 〜*'(

DecimalDigit ::: 0 1 2 3 4 5 6 7 8 9

相關問題