2016-02-04 5 views
8

Я кодирую имя файла и отправляю его как часть 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 ссылка справа):

Comparison

Я также попытался скопировать и вставить действительная ссылка (построенная в 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 Дальнейшие исследования показали, что следующие символы кодируются по-разному, и в результате чего 'Файл не найден' исключение на сервере:

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

Я собираюсь предположить, что это либо что карта FireFox шрифт другой, или что все FF использует для интерпретатора JavaScript выходит от удара. – durbnpoisn

+1

'% 3F'' '', так что похоже, что он неправильно понимает юникод. –

+0

@JamesThorpe да, вы правы. Но, как вы можете видеть, другая часть URL-адреса кодируется по-разному, и если я удаляю '你好' с самого начала, он все равно терпит неудачу. – naXa

ответ

1

I предположим, что ваша проблема не является методом encodeURIComponent(). Это кодировка любых конструкций file.name. Расширьте свой вопрос. Как инициализируется file.name? Откуда берутся символы?

+0

Список файлов с их именами получен от сервера. – naXa

+1

Итак, можете ли вы удостовериться (с помощью отладчика JS), что имя файла, как раз перед передачей encodeURIComponent(), содержит правильные символы (а не вопросительные знаки)? –

+0

@naXa Действительно, попробуйте 'encodeURIComponent (« 你好 »)' в консоли devtools, он возвращает «% E4% BD% A0% E5% A5% BD», как и ожидалось. – Nickolay

-1

encodeURIComponent() - это встроенная функция, поэтому Firefox, очевидно, использует некоторые различные реализации под обложками.

Если вы застряли, просто доставьте собственную реализацию javascript для encodeURIComponent(), тогда вы получите одинаковые результаты в браузерах. Вот ссылка, как получить открытый исходный экземпляр, что:

encodeURIComponent algorithm source code

Смежные вопросы