2016-02-04 16 views
8

Tôi mã hóa tên tệp và gửi nó làm một phần của URL như /rest/get?name=Filename.txt. Trong JS xây dựng liên kết là đơn giản nhưHành vi khác của encodeURIComponent() trong Firefox chỉ

url = '/rest/get?name=' + window.encodeURIComponent(file.name); 

Nó hoạt động tốt đối với trường hợp đơn giản nhưng để thử nghiệm Hardcore tôi sử dụng một tập tin có tên

你好abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§!#¤%&()=`@£$€{[]}+´¨^~'-_,;.txt 

Sau khi mã hóa URI Tôi hy vọng sẽ nhận được một liên kết

/rest/get?name=%E4%BD%A0%E5%A5%BDabcABC%C3%A6%C3%B8%C3%A5%C3%86%C3%98%C3%85%C3%A4%C3%B6%C3%BC%C3%AF%C3%AB%C3%AA%C3%AE%C3%A2%C3%A9%C3%AD%C3%A1%C3%B3%C3%BA%C3%BD%C3%B1%C2%BD%C2%A7%3F%3FabcABC%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD!%23%C2%A4%25%26()%3D%60%40%C2%A3%24%E2%82%AC%7B%5B%5D%7D%2B%C2%B4%C2%A8%5E~%27-_%2C%3B.txt 

Và tôi hiểu rồi. Liên kết được xây dựng hoạt động tốt trong các phiên bản mới nhất của IE và Chrome nhưng không thành công trong Firefox. Sau một số điều tra, tôi thấy rằng trong Firefox encodeURIcomponent hoạt động khác nhau. Dưới đây là kết quả thực tế trong Firefox:

/rest/get?name=%3F%3FabcABC%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD!%23%EF%BF%BD%25%26%28%29%3D%60%40%EF%BF%BD%24%3F{[]}%2B%EF%BF%BD%EF%BF%BD^~%27-_%2C%3B.txt 

trực quan so sánh (liên kết Chrome là ở bên trái và Firefox liên kết là ở bên phải):

Comparison

Tôi cũng đã cố gắng để sao chép và dán liên kết hợp lệ (được xây dựng trong Chrome) với Firefox và nó hoạt động tốt.

Tại sao tôi nhận được kết quả khác?
nó là một lỗi với ̶ ̶e̶n̶c̶o̶d̶e̶U̶R̶I̶c̶o̶m̶p̶o̶n̶e̶n̶t̶(̶)̶ ̶ trong Firefox? ̶
Liệu Firefox sử dụng một mã hóa khác nhau trong encodeURIComponent()?

UPD. Tôi đã tìm thấy các câu hỏi tương tự (encodeURIComponent behaves differently in browsers for China as location [搜索] và encodeURIComponent difference with browsers and ä-ö-å characters [äöå]), cả hai đều không có câu trả lời.

UPD.2 Tiếp tục điều tra đã chỉ ra rằng các ký tự sau được mã hóa khác nhau và gây 'tập tin không tìm thấy' ngoại lệ trên máy chủ:

  • 你好
  • æøåÆØÅäöüïëêîâéíáóúýñ
  • ½§¤
  • £ €
+0

tôi sẽ đoán rằng nó là một trong hai rằng FireFox bản đồ phông chữ là khác nhau, hoặc bất cứ điều gì FF sử dụng cho một thông dịch viên JavaScript là ra của Whack. – durbnpoisn

+1

'% 3F' là'? ', Có vẻ như nó không hiểu chính xác unicode. –

+0

@ JamesThorpe vâng, bạn nói đúng. Nhưng như bạn có thể thấy một phần khác của URL được mã hóa khác nhau và nếu tôi loại bỏ '你好' từ đầu nó vẫn không thành công. – naXa

Trả lời

1

I giả sử vấn đề của bạn không phải là phương thức encodeURIComponent(). Mã hóa của bất kỳ cấu trúc nào là file.name. Mở rộng câu hỏi của bạn. file.name được khởi tạo như thế nào? Các ký tự đến từ đâu?

+0

Danh sách các tệp có tên của chúng được nhận từ máy chủ. – naXa

+1

vì vậy, bạn có thể đảm bảo (bằng cách sử dụng trình gỡ rối JS), tệp đó.name, ngay trước khi được chuyển đến encodeURIComponent(), chứa các ký tự thích hợp (và không phải là dấu hỏi)? –

+0

@naXa Thật vậy, hãy thử 'encodeURIComponent (" 你好 ")' trong bảng điều khiển devtools, nó trả về "% E4% BD% A0% E5% A5% BD", giống như bạn mong đợi. – Nickolay

-1

encodeURIComponent() là một hàm gốc nên Firefox rõ ràng đang sử dụng một số triển khai khác nhau trong trang bìa.

Nếu bạn gặp khó khăn, sau đó chỉ cần thực hiện javascript của riêng bạn thực hiện encodeURIComponent(), sau đó bạn sẽ nhận được kết quả tương tự trên các trình duyệt. Dưới đây là một liên kết như thế nào để có được một bản sao mã nguồn mở về điều đó:

encodeURIComponent algorithm source code

Các vấn đề liên quan