Unicode в заголовке Довольного Расположения

Я использую объект HttpContext, реализованный в ребенке HttpHandler для загрузки файла, когда у меня есть символы неASCII в имени файла, это выглядит странным в IE, тогда как это выглядит хорошо в Firefox.

ниже код:-

       context.Response.ContentType = ".cs";
context.Response.AppendHeader("Content-Length", data.Length.ToString());
context.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}",filename));
        context.Response.OutputStream.Write(data, 0, data.Length);

context.Response.Flush();

когда я предоставляю 'ä' 'ß' 'à ¶' 'ü' 'à ³' 'ß' 'ä' 'à ¶' 'ü' 'à ³', в поле имени файла он выглядит по-другому, чем, что я имею в имени файла, которое он выглядит хорошо в Firefox. добавление EncodingType и набора символов было бесполезно.

В т.е. это - 'ʸ ''ä ''ච''ü ''à³ ''ʸ ''ä ''ච_'à'¦ƒ¦¼' ³', и в Firefox это - 'ä' 'ß' 'à ¶' 'ü' 'à ³' 'ß' 'ä' 'à ¶' 'ü' 'à ³'.

Какая-либо Идея, как это может быть зафиксировано?

11
задан jomo 3 December 2014 в 14:25
поделиться

1 ответ

У меня была похожая проблема. Вам нужно использовать HttpUtility.UrlEncode или Server.UrlEncode для кодирования имени файла. Также я помню, что firefox не нуждался в этом. Более того, он портит имя файла при url-кодировании. Мой код:

// IE needs url encoding, FF doesn't support it, Google Chrome doesn't care
if (Request.Browser.IsBrowser ("IE"))
{
    fileName = Server.UrlEncode(fileName);
}

Response.Clear ();
Response.AddHeader ("content-disposition", String.Format ("attachment;filename=\"{0}\"", fileName));
Response.AddHeader ("Content-Length", data.Length.ToString (CultureInfo.InvariantCulture));
Response.ContentType = mimeType;
Response.BinaryWrite(data);

Edit

Я прочитал спецификацию более внимательно. Во-первых, в RFC2183 говорится, что:

Текущая грамматика [RFC 2045] ограничивает значения параметров (и, следовательно, имена файлов Content-Disposition) US-ASCII.

Но затем я нашел ссылки на то, что [RFC 2045] устарел и нужно ссылаться на RFC 2231, в котором говорится:

Звездочки ("*") используются повторно, чтобы обеспечить индикатора того, что язык и информация о языке и наборе символов присутствует и используется кодировка. Одиночная кавычка ("'") используется для разграничения информацию о наборе символов и языке в начале параметра значение. Знаки процента ("%") используются в качестве флаг кодировки, что согласуется с RFC 2047.

Это означает, что вы можете использовать UrlEncode для символов, не являющихсяascii, при условии, что вы указываете кодировку, как указано в rfc. Вот пример:

string.Format("attachment; filename=\"{0}\"; filename*=UTF-8''{0}", Server.UrlEncode(fileName, Encoding.UTF8));

Обратите внимание, что filename включено в дополнение к filename* для обратной совместимости. Вы также можете выбрать другую кодировку и соответствующим образом изменить параметр, но UTF-8 покрывает все.

20
ответ дан 3 December 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: