Я кодирую имя файла и отправляю его как часть URL-адреса, например /rest/get?name=Filename.txt
. В JS ссылка строительство так просто, какРазличное поведение encodeURIComponent() только в Firefox
url = '/rest/get?name=' + window.encodeURIComponent(file.name);
Это хорошо работает для простых случаев, но и для хардкора тестирования я использую файл с именем
你好abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§!#¤%&()=`@£$€{[]}+´¨^~'-_,;.txt
После кодирования URI я ожидаю, чтобы получить ссылку
/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
И я понял. Построенная ссылка работает нормально в последних версиях IE и Chrome, но не работает в Firefox. После некоторого расследования я обнаружил, что в Firefox encodeURIcomponent
работает по-разному. Вот реальный результат в 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
Визуальное сравнение (Chrome ссылка на левой и Firefox ссылка справа):
Я также попытался скопировать и вставить действительная ссылка (построенная в Chrome) в Firefox, и она работает нормально.
Почему у меня разные результаты?
это ошибка с ̶ ̶ ̶e̶n̶c̶o̶d̶e̶U̶R̶I̶c̶o̶m̶p̶o̶n̶e̶n̶t̶(̶)̶
в FireFox? ̶
ли использовать Firefox другую кодировку в encodeURIComponent()
?
UPD. Я нашел похожие вопросы (encodeURIComponent behaves differently in browsers for China as location [搜索] и encodeURIComponent difference with browsers and ä-ö-å characters [äöå]), оба без ответа.
UPD.2 Дальнейшие исследования показали, что следующие символы кодируются по-разному, и в результате чего 'Файл не найден' исключение на сервере:
- 你好
- æøåÆØÅäöüïëêîâéíáóúýñ
- ½§¤
- £
Я собираюсь предположить, что это либо что карта FireFox шрифт другой, или что все FF использует для интерпретатора JavaScript выходит от удара. – durbnpoisn
'% 3F'' '', так что похоже, что он неправильно понимает юникод. –
@JamesThorpe да, вы правы. Но, как вы можете видеть, другая часть URL-адреса кодируется по-разному, и если я удаляю '你好' с самого начала, он все равно терпит неудачу. – naXa