請說說escape、encodeURI、decodeURI、encodeURIComponent和decodeURIComponent的區別?

王铁柱6發表於2024-11-25

這五個函式都是 JavaScript 中用於處理 URI 的函式,但它們的目標和處理範圍不同:

1. escape()unescape():

  • escape(): 對字串進行編碼,將非 ASCII 字元轉換為 %xx%uxxxx 格式。已廢棄,不推薦使用,因為它不能正確處理非 ASCII 字元,特別是 Unicode 字元。它主要用於對 ASCII 字串進行編碼,例如將空格轉換為 %20
  • unescape():escape() 編碼的字串進行解碼。同樣已廢棄

2. encodeURI()decodeURI():

  • encodeURI(): 用於編碼整個 URI。它會將 URI 中的特殊字元(例如空格、#、? 等)轉換為 %xx 格式,但不會編碼 URI 的保留字元,例如 : / ? ; = + & @ # 等。目的是對整個 URI 進行編碼,以便在瀏覽器位址列或連結中使用。
  • decodeURI():encodeURI() 編碼的 URI 進行解碼。

3. encodeURIComponent()decodeURIComponent():

  • encodeURIComponent(): 用於編碼 URI 的組成部分,例如查詢引數。它會將所有非字母數字字元(除了 - _ . ! ~ * ' ( ))轉換為 %xx 格式,包括保留字元。目的是對 URI 的各個部分進行編碼,以便安全地將其作為查詢引數或其他 URI 元件使用。
  • decodeURIComponent():encodeURIComponent() 編碼的 URI 元件進行解碼。

總結與對比:

特性 escape() encodeURI() encodeURIComponent()
目的 編碼字串(已廢棄) 編碼整個 URI 編碼 URI 元件
編碼範圍 非 ASCII 字元 URI 中的特殊字元,不包括保留字元 所有非字母數字字元,包括保留字元
保留字元 不處理 不編碼 編碼
示例 escape("你好 世界") -> %u4F60%u597D%20%u4E16%u753B (已廢棄) encodeURI("https://www.example.com/你好 世界") -> https://www.example.com/%E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C encodeURIComponent("你好 世界") -> %E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C
推薦使用 ✅ 用於編碼整個 URI ✅ 用於編碼 URI 元件

實際應用場景:

  • 如果你需要編碼整個 URI,例如在 <a> 標籤的 href 屬性中使用,應該使用 encodeURI()
  • 如果你需要編碼 URI 的一部分,例如查詢引數,應該使用 encodeURIComponent()

強烈建議避免使用escape()unescape(),它們已經過時並且存在編碼問題。 使用 encodeURI()encodeURIComponent() 可以更好地處理 Unicode 字元,並提供更可靠的 URI 編碼和解碼功能。

相關文章