Sự khác biệt giữa các hàm JavaScript decodeURIComponentvà là decodeURIgì?
Sự khác biệt giữa các hàm JavaScript decodeURIComponentvà là decodeURIgì?
Câu trả lời:
Để giải thích sự khác biệt giữa hai điều này, hãy để tôi giải thích sự khác biệt giữa encodeURIvà encodeURIComponent.
Sự khác biệt chính là:
encodeURIchức năng được thiết kế để sử dụng trên toàn bộ URI.encodeURIComponentchức năng được thiết kế để được sử dụng trên .. cũng .. thành phần URI đó là bất kỳ phần nào đó nằm giữa dải phân cách (; /: @ & = + $, #?).Vì vậy, trong encodeURIComponentcác dấu phân cách này cũng được mã hóa bởi vì chúng được coi là văn bản và không phải là ký tự đặc biệt.
Bây giờ trở lại sự khác biệt giữa các hàm giải mã, mỗi hàm giải mã các chuỗi được tạo bởi đối tác mã hóa tương ứng của nó, đảm nhiệm ngữ nghĩa của các ký tự đặc biệt và cách xử lý của chúng.
encodeURIComponent / decodeURIComponent () gần như luôn luôn là cặp bạn muốn sử dụng, để nối với nhau và tách các chuỗi văn bản trong các phần URI.
encodeURI trong ít phổ biến hơn và được đặt tên sai: nó thực sự nên được gọi là fixBrokenURI. Nó lấy thứ gì đó gần bằng URI, nhưng có các ký tự không hợp lệ như khoảng trắng trong đó và biến nó thành URI thực. Nó có một cách sử dụng hợp lệ trong việc sửa các URI không hợp lệ từ đầu vào của người dùng và nó cũng có thể được sử dụng để biến IRI (URI có các ký tự Unicode trống) thành một URI đơn giản (sử dụng UTF-8 được mã hóa% để mã hóa không phải ASCII ).
decodeURI giải mã các ký tự tương tự như decodeURIComponent ngoại trừ một vài ký tự đặc biệt. Nó được cung cấp để nghịch đảo của encodeURI, nhưng bạn vẫn không thể tin tưởng vào nó để trả về giống như lúc ban đầu bạn đặt vào - xem ví dụ. decodeURI(encodeURI('%20 '));.
Trường hợp encodeURI thực sự nên được đặt tên là fixBrokenURI (), decodeURI () có thể được gọi tương tự như có khả năngBreakMyPreinglylyWorkingURI (). Tôi có thể nghĩ rằng không có sử dụng hợp lệ cho nó bất cứ nơi nào; tránh.
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
Dường như encodeURItạo ra một URI "an toàn" bằng cách mã hóa các khoảng trắng và một số ký tự khác (ví dụ không thể in được), trong khi đó encodeURIComponentcũng mã hóa dấu hai chấm và dấu gạch chéo và các ký tự cộng, và được sử dụng trong các chuỗi truy vấn. Mã hóa của + và? và & có tầm quan trọng đặc biệt ở đây, vì đây là những ký tự đặc biệt trong chuỗi truy vấn.
Khi tôi có cùng một câu hỏi, nhưng không tìm thấy câu trả lời ở đây, tôi đã thực hiện một số thử nghiệm để tìm ra sự khác biệt thực sự là gì. Tôi đã làm điều này, vì tôi cần mã hóa cho một cái gì đó, không liên quan đến URL / URI.
encodeURIComponent("A") trả về "A", nó không mã hóa "A" thành "% 41"decodeURIComponent("%41") trả về "A".encodeURI("A") trả về "A", nó không mã hóa "A" thành "% 41"decodeURI("%41") trả về "A".-Điều đó có nghĩa là cả hai có thể giải mã các ký tự chữ và số, mặc dù chúng không mã hóa chúng. Tuy nhiên...
encodeURIComponent("&") trả về "% 26".decodeURIComponent("%26") trả về "&".encodeURI("&") trả về "&".decodeURI("%26") trả về "% 26".Mặc dù encodeURIComponent không mã hóa tất cả các ký tự, decodeURIComponent có thể giải mã bất kỳ giá trị nào giữa% 00 và% 7F.
Lưu ý: Có vẻ như nếu bạn cố gắng giải mã một giá trị trên% 7F (trừ khi đó là giá trị unicode), thì tập lệnh của bạn sẽ thất bại với "lỗi URI".
encodeURIComponent()Chuyển đổi đầu vào thành một chuỗi được mã hóa URL
encodeURI()URL mã hóa đầu vào, nhưng giả sử một URL đầy đủ được cung cấp, do đó trả về một URL hợp lệ bằng cách không mã hóa giao thức (ví dụ: http: // ) và tên máy chủ (ví dụ : www.stackoverflow.com ).
decodeURIComponent()và decodeURI()ngược lại với những điều trên
encodeURIComponent Không thoát:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURI () Không thoát:
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") == "é";