อะไรคือความแตกต่างระหว่างฟังก์ชั่น JavaScript decodeURIComponentและdecodeURI?
อะไรคือความแตกต่างระหว่างฟังก์ชั่น JavaScript decodeURIComponentและdecodeURI?
คำตอบ:
การอธิบายความแตกต่างระหว่างสองคนนี้ให้ฉันอธิบายความแตกต่างระหว่างและencodeURIencodeURIComponent
ความแตกต่างที่สำคัญคือ:
encodeURIฟังก์ชั่นที่มีไว้สำหรับการใช้งานบนเต็ม URIencodeURIComponentฟังก์ชั่นมีจุดมุ่งหมายที่จะใช้ใน .. ดี .. ส่วนประกอบ URI ที่เป็นส่วนหนึ่งที่อยู่ระหว่างแยก (; /?: @ & = + $, #)ดังนั้นในencodeURIComponentตัวคั่นเหล่านี้จะถูกเข้ารหัสด้วยเพราะถือเป็นข้อความและไม่ใช่อักขระพิเศษ
ตอนนี้กลับไปสู่ความแตกต่างระหว่างฟังก์ชั่นถอดรหัสแต่ละฟังก์ชั่นถอดรหัสสตริงที่สร้างขึ้นโดยการเข้ารหัสที่สอดคล้องกันดูแลความหมายของอักขระพิเศษและการจัดการของพวกเขา
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 () ฉันสามารถคิดได้ว่าไม่มีการใช้ที่ถูกต้องสำหรับทุกที่; หลีกเลี่ยงการ
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เข้ารหัสลำไส้ใหญ่และเครื่องหมายทับและอักขระเพิ่มเติมอีกทั้งยังมีไว้เพื่อใช้ในสตริงการสืบค้น การเข้ารหัสของ + และ? และ & มีความสำคัญเป็นพิเศษที่นี่เนื่องจากเป็นอักขระพิเศษในสตริงข้อความค้นหา
เมื่อฉันมีคำถามเดียวกัน แต่ไม่พบคำตอบที่นี่ฉันได้ทำการทดสอบเพื่อที่จะเข้าใจว่าความแตกต่างคืออะไร ฉันทำสิ่งนี้เนื่องจากฉันต้องการการเข้ารหัสสำหรับบางสิ่งซึ่งไม่เกี่ยวข้องกับ 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"
encodeURIComponent()แปลงอินพุตเป็นสตริงที่เข้ารหัส URL
encodeURI()URL เข้ารหัสอินพุต แต่สมมติว่าได้รับ URL เต็มดังนั้นจะส่งคืน URL ที่ถูกต้องโดยไม่เข้ารหัสโปรโตคอล (เช่นhttp: // ) และชื่อโฮสต์ (เช่น www.stackoverflow.com )
decodeURIComponent()และdecodeURI()อยู่ตรงข้ามกับด้านบน
decodeURIComponent จะถอดรหัสเครื่องหมายพิเศษของ URI เช่น &,?, #, ฯลฯ decodeURI จะไม่
การเข้ารหัสไม่ได้หลบหนี:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURI () ไม่หนี:
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";