Как отобразить не-ascii имя файла в окне загрузки файлов в браузерах? - PullRequest
8 голосов
/ 29 сентября 2008

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

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

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

За исключением случаев, когда вы разбиваете строку в кодировке utf8 в параметре имени файла, Firefox прекрасно с этим справится, тогда как IE сработает.

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

Этот документ кодирует Bản Kiểm Kê.doc в B% e1% ba% a3n% 20Ki% e1% bb% 83m% 20K% c3% aa.doc, используя шестнадцатеричное кодирование байтов.

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

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

Ответы [ 6 ]

8 голосов
/ 30 сентября 2008

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

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

РЕДАКТИРОВАТЬ: Упс, нет, в разделе 5 RFC 2047 прямо говорится, что закодированная форма не допускается в Content-Disposition. Похоже, вам не повезло - стандарта нет.

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

3 голосов
/ 29 сентября 2008

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

2 голосов
/ 04 ноября 2008

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

1 голос
/ 29 сентября 2008

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

0 голосов
/ 15 января 2009

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

См. http://greenbytes.de/tech/tc2231/ для тестовых случаев, а затем подайте жалобу в Microsoft, Google и Apple.

0 голосов
/ 29 сентября 2008

Ответ (вроде) на проблему № 2:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...