Как отобразить имя файла, отличное от ascii, в окне загрузки файла в браузерах?
Вопрос
Похоже, что не существует общепринятого способа отправки параметра заголовка в формате, отличном от 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.