Как отобразить имя файла, отличное от ascii, в окне загрузки файла в браузерах?

StackOverflow https://stackoverflow.com/questions/149058

  •  02-07-2019
  •  | 
  •  

Вопрос

Похоже, что не существует общепринятого способа отправки параметра заголовка в формате, отличном от ascii.

Заголовок для загрузки файла обычно выглядит следующим образом

Содержание-диспозиция:привязанность;имя файла="theasciifilename.doc"

За исключением того, что если вы добавите строку в кодировке utf8 в параметр filename, Firefox обработает ее нормально, в то время как IE выдаст ошибку.

Существует документ о CodeProject, в котором объясняется метод кодирования имени файла.

Этот документ кодирует BảN KiểM Kê.doc to B%e1%ba%a3n%20Ki%e1%bb%83m%20K%c3%aa.doc с помощью шестнадцатеричной кодировки байтов.

Проблема №1:первый символ в этой строке:ả имеет значение ả - закодируйте это число в шестнадцатеричном формате, и вы получите %a3%1e.Как этот парень получил %e1%ba%a3?(Очевидно, я упускаю здесь что-то простое)

Проблема №2:В то время как IE признает эту кодировку, Firefox - нет!Что же делать?

Это было полезно?

Решение

Ответ на вопрос № 1:Вы путаете Unicode и UTF-8.Шестнадцатеричное значение 'ả' равно 0xA31E, однако это не символ UTF-8.В UTF-8 этот символ требует трех байт, 0xE1 0xBA 0xA3.Кодировка URL-адреса плохо определена для кодировок, отличных от ascii, но %e1%ba%a3 - допустимая кодировка UTF-8 для использования этого символа.

Другие советы

Спецификации в принципе не допускают ничего, кроме US-ASCII.HTTP-заголовки имеют формат US-ASCII.Полезная нагрузка HTTP по умолчанию равна ISO 8859-1, но это относится к телу содержимого, а не к заголовкам.

Возможно, правильным решением было бы использовать технику MIME для кодирования данных, отличных от ASCII, в заголовках, как описано в RFC 2047, но я понятия не имею, действительно ли браузеры поддерживают это.

Редактировать: Упс, нет, в разделе 5 RFC 2047 явно сказано, что закодированная форма не разрешена в Content-Disposition.Похоже, вам не повезло - стандарта нет.

ПРАВКА 2: Существует стандарт - RFC 2231 определяет, как это теперь должно работать.Он поддерживается некоторыми браузерами, но не поддерживается в IE.Я нашел некоторые тестовые примеры которые демонстрируют, как это работает и какая поддержка браузера доступна.

Для решения проблемы № 2 вам необходимо по URL-адресу закодировать имя файла как для Internet Explorer, так и для Firefox.Единственное отличие заключается в том, что вам нужно использовать формат RFC 2231 в Firefox.Это относится к Firefox 3 и Internet Explorer 7.

В ссылке, которую вы получили выше, e1 ba a3 - это кодировка UTF-8 упомянутого символа, а не код символа.

Ответ (вроде как) на задачу №2:

Поскольку вы обнаружили, что схема именования в одном браузере не работает в другом, ваше единственное решение - сделать это по-разному для каждого браузера, аналогично приведенному в примере здесь.

В случае, если ссылка исчезнет, решение в основном таково:

1. If browser is IE URL encode filename
2. Generate Content-disposition header

Конечно, определение того, является ли браузер IE с помощью User-agent (что, пожалуй, единственный способ, которым вы можете это сделать), сопряжено со всевозможными обычными опасностями.

Как бы это ни звучало ориентированно на Северную Америку, если важно, чтобы это работало в большом количестве браузеров, которые вы не контролируете, в которых пользовательский агент может быть заблокирован или изменен, то просто избегайте символов в кодировке UTF-8 в имени файла и всегда используйте "Загрузить" или что-то в этом роде.

К сожалению, в настоящее время не существует единого способа, который работал бы во всех пользовательских агентах.

Видишь http://greenbytes.de/tech/tc2231/ что касается тестовых примеров, то жалуйтесь в Microsoft, Google и Apple.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top