2008-09-29 4 views
8

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

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

Content-Disposition: вложение; filename = "theasciifilename.doc"

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

Существует document on CodeProject that explains a method for encoding the filename.

Этот документ кодирует Ban Kiem Kê.doc до В% e1% Ьа% A3n% 20Ki% e1% бб% 83m% 20K% с3% aa.doc по гекс, кодирующей байты.

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

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

ответ

3

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

+0

Нет такой вещи, как символ «UTF-8». – immibis 2015-02-10 07:00:16

1

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

0

Ответ (вид) к задаче № 2:

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

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

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

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

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

8

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

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

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

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

+0

IE8 (и выше) поддерживает RFC 2231, как и все другие современные браузеры. Единственными, которые не распознают указанное имя файла в этом формате и которые по-прежнему пользуются некоторой популярностью, являются IE6 и IE7. – 2012-12-29 10:01:11

2

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

0

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

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

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

  • Нет связанных вопросов^_^