decodeURIComponent และ decodeURI แตกต่างกันอย่างไร


คำตอบ:


398

การอธิบายความแตกต่างระหว่างสองคนนี้ให้ฉันอธิบายความแตกต่างระหว่างและencodeURIencodeURIComponent

ความแตกต่างที่สำคัญคือ:

  • encodeURIฟังก์ชั่นที่มีไว้สำหรับการใช้งานบนเต็ม URI
  • encodeURIComponentฟังก์ชั่นมีจุดมุ่งหมายที่จะใช้ใน .. ดี .. ส่วนประกอบ URI ที่เป็นส่วนหนึ่งที่อยู่ระหว่างแยก (; /?: @ & = + $, #)

ดังนั้นในencodeURIComponentตัวคั่นเหล่านี้จะถูกเข้ารหัสด้วยเพราะถือเป็นข้อความและไม่ใช่อักขระพิเศษ

ตอนนี้กลับไปสู่ความแตกต่างระหว่างฟังก์ชั่นถอดรหัสแต่ละฟังก์ชั่นถอดรหัสสตริงที่สร้างขึ้นโดยการเข้ารหัสที่สอดคล้องกันดูแลความหมายของอักขระพิเศษและการจัดการของพวกเขา


4
อีกความแตกต่างที่สำคัญคือว่า unescape ไม่ได้จัดการกับหลายไบต์ UTF-8 ลำดับในขณะที่ decodeURI [ตัวแทน] ไม่:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
คริส

IMHO การยกตัวอย่างจะเป็นประโยชน์อย่างมาก
transang

114

encodeURIComponent / decodeURIComponent () เกือบทุกคู่ที่คุณต้องการใช้สำหรับการเชื่อมต่อกันและแยกสตริงข้อความออกเป็นส่วน ๆ ใน URI

encodeURI โดยทั่วไปน้อยลงและตั้งชื่อที่ทำให้เข้าใจผิด: ควรเรียกว่า fixBrokenURI จริงๆ ใช้บางสิ่งที่เกือบเป็น URI แต่มีอักขระที่ไม่ถูกต้องเช่นช่องว่างในนั้นและเปลี่ยนเป็น URI จริง มีการใช้งานที่ถูกต้องในการแก้ไข URIs ที่ไม่ถูกต้องจากการป้อนข้อมูลของผู้ใช้และยังสามารถใช้เพื่อเปลี่ยน IRI (URI ด้วยอักขระ Unicode เปลือยใน) เป็น URI ธรรมดา (ใช้ UTF-8 ที่มีการเข้ารหัส%% เพื่อเข้ารหัส non-ASCII )

decodeURI ถอดรหัสอักขระเดียวกันกับ decodeURIComponent ยกเว้นอักขระพิเศษบางตัว มันให้ไว้เพื่อเป็นค่าผกผันของ encodeURI แต่คุณยังไม่สามารถนับได้ว่าจะกลับมาเหมือนเดิมเมื่อคุณใส่เข้าไป - ดูเช่น decodeURI(encodeURI('%20 '));.

โดยที่ encodeURI ควรตั้งชื่อว่า fixBrokenURI () decodeURI () สามารถเรียกได้ว่าเป็นอย่างเท่าเทียมกันอย่าง BREAKMyPreviouslyWorkingURI () ฉันสามารถคิดได้ว่าไม่มีการใช้ที่ถูกต้องสำหรับทุกที่; หลีกเลี่ยงการ


11
decodeURI (encodeURI ('% 20')) ให้ '% 20' ถูกต้องในเช่น chrome และ firefox เพียงแค่สงสัยว่าเบราว์เซอร์ / เวอร์ชันใดที่คุณสังเกตเห็นผลลัพธ์ที่ไม่ถูกต้อง
ccppjava

1
อาจมีการแตกในปี 2009 แต่เบราว์เซอร์ที่ทันสมัยทันในขณะเดียวกัน (ฉันเดา)
WoodrowShigeru

68
js> s = "http://www.example.com/string with + and ? and & and spaces";
http://www.example.com/string with + and ? and & and spaces
js> encodeURI(s)
http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
js> encodeURIComponent(s)
http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces

ดูเหมือนencodeURIจะสร้าง URI ที่ "ปลอดภัย" โดยการเข้ารหัสช่องว่างและอักขระอื่น ๆ (เช่นที่ไม่สามารถพิมพ์ได้) ในขณะที่encodeURIComponentเข้ารหัสลำไส้ใหญ่และเครื่องหมายทับและอักขระเพิ่มเติมอีกทั้งยังมีไว้เพื่อใช้ในสตริงการสืบค้น การเข้ารหัสของ + และ? และ & มีความสำคัญเป็นพิเศษที่นี่เนื่องจากเป็นอักขระพิเศษในสตริงข้อความค้นหา


30

เมื่อฉันมีคำถามเดียวกัน แต่ไม่พบคำตอบที่นี่ฉันได้ทำการทดสอบเพื่อที่จะเข้าใจว่าความแตกต่างคืออะไร ฉันทำสิ่งนี้เนื่องจากฉันต้องการการเข้ารหัสสำหรับบางสิ่งซึ่งไม่เกี่ยวข้องกับ URL / URI

  • encodeURIComponent("A") ส่งกลับ "A" มันไม่ได้เข้ารหัส "A" ถึง "% 41"
  • decodeURIComponent("%41") ส่งคืน "A"
  • encodeURI("A") ส่งกลับ "A" มันไม่ได้เข้ารหัส "A" ถึง "% 41"
  • decodeURI("%41") ส่งคืน "A"

- นั่นหมายความว่าทั้งสองสามารถถอดรหัสอักขระตัวอักษรและตัวเลขแม้ว่าพวกเขาจะไม่ได้เข้ารหัส อย่างไรก็ตาม ...

  • encodeURIComponent("&") ส่งคืน "% 26"
  • decodeURIComponent("%26") ส่งคืน "&"
  • encodeURI("&") ส่งคืน "&"
  • decodeURI("%26") ส่งคืน "% 26"

แม้ว่า encodeURIComponent ไม่ได้เข้ารหัสอักขระทั้งหมด แต่ decodeURIComponent สามารถถอดรหัสค่าใด ๆ ระหว่าง% 00 ถึง% 7F

หมายเหตุ: ดูเหมือนว่าหากคุณพยายามถอดรหัสค่าที่อยู่เหนือ% 7F (ยกเว้นว่าเป็นค่า unicode) สคริปต์ของคุณจะล้มเหลวด้วย "ข้อผิดพลาด URI"


หมายเหตุ: มีการพิมพ์ผิดใน decodeURIComponent แรก (m แทน n) ฉันไม่สามารถแก้ไขได้เพราะฉันต้องแก้ไขอย่างน้อย 6 ตัวอักษร
SuperNova

23

encodeURIComponent()

แปลงอินพุตเป็นสตริงที่เข้ารหัส URL

encodeURI()

URL เข้ารหัสอินพุต แต่สมมติว่าได้รับ URL เต็มดังนั้นจะส่งคืน URL ที่ถูกต้องโดยไม่เข้ารหัสโปรโตคอล (เช่นhttp: // ) และชื่อโฮสต์ (เช่น www.stackoverflow.com )

decodeURIComponent()และdecodeURI()อยู่ตรงข้ามกับด้านบน


12

decodeURIComponent จะถอดรหัสเครื่องหมายพิเศษของ URI เช่น &,?, #, ฯลฯ decodeURI จะไม่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.