2012-01-30 16 views
29

tôi bước vào sau trong giao diện điều khiển của Chrome:Javascript decodeURI (Component) bị thay đổi uri ngoại lệ

decodeURIComponent('a%AFc'); 

Thay vì dẫn đến a0xAFc, nó gây ra một ngoại lệ URIError (bị thay đổi uri).

Tôi đã nghe một số lý do tại sao điều này có thể xảy ra, nhưng điều tôi không hiểu là lý do tại sao?

Đặc biệt, hàm decodeURIComponent() có nghĩa vụ giải mã dữ liệu, không xác minh URI.

Trả lời

37

%AF không phải là một nhân vật của riêng mình nhưng một phần của Unicode chuỗi (MACRON - %C2%AF).

%AF không được sản xuất bởi encodeURIComponent nhưng giống như escape, vì vậy nó có thể được giải mã bằng unescape.

gì bạn có thể cần là decodeURIComponent('%C2%AF')

+2

tôi đã làm cho nó lên sau khi tôi đã cố gắng giải mã một tải trọng của văn bản được mã hóa, thất bại và nhận thấy nó sẽ nghẹt thở trên mà nhân vật cụ thể. Có lẽ 'unescape' là thứ tôi cần. – Christian

+1

@ChristianSciberras 'encodeURIComponent()' thường là một lựa chọn tốt hơn vì nó hoạt động với UTF-8. Tuy nhiên, bản thân '0xAF' không phải là chuỗi ký tự được mã hóa UTF-8 hợp lệ. Đây là lý do tại sao mã của bạn không hoạt động. Tôi hy vọng nó rõ ràng hơn bây giờ. – duri

+3

Vậy nếu tôi cần xử lý các đầu vào được mã hóa theo phần trăm ASCII/iso-8859-1 thì sao? 'unescape' không được chấp nhận và cũng không có' unescapeURI' – felixfbecker