Вопрос

В настоящее время я использую Visual Studio 2008 для своего приложения ASP .NET.Я пытаюсь отправить на сервер файл Excel через объект Response .Проблема в том, что, похоже, я не могу установить заголовок файла на японский.Если я установлю для него японское имя файла, оно будет возвращено как символ мусора.Я использую японский браузер IE в японском WinXP.

Response.AppendHeader("Content-Type", "application/vnd.ms-excel");
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", "日本語.xls"));

или

Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", Server.HtmlEncode("日本語.xls")));

Я уже пытался изменить кодировку на Shift-JIS

Response.Charset = "Shift_JIS";

или

Response.Charset = "sjis";

Есть какие-нибудь идеи?Кстати, у меня тоже была такая же проблема с Visual Studio 2005.

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

Решение

Я не эксперт по ASP, но вы пробовали перекодировать имя файла с помощью UrlEncode?

Response.AddHeader("Content-Disposition",
    System.Web.HttpUtility.UrlEncode(String.Format("attachment; filename=\"{0}\"", "日本語.xls")));

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

Response.Charset касается только тела HTTP-запроса.Согласно спецификация HTTP, заголовки неявно кодируются как ISO-8859-1 - символы вне этой кодировки должны быть MIME-кодированный.

Это вполне логично - в конце концов, кодировка тела, установленная Response.Charset сам по себе указан в заголовке.

Наконец-то у меня это заработало...:)

Использование System.Web.HttpUtility.UrlPathEncode решает проблему мусора, но когда вы открываете файл, в имени файла вместо реальных японских символов отображаются имена, не закодированные в юникоде.(Ну, это проблема в IE7 и IE6, UrlPathEncode отлично работает с IE8.)

Итак, вместо того, чтобы использовать System.Web.HttpUtility.UrlPathEncode вы должны расшифровать имя файла, используя кодировку, используемую для заголовка ответа.

В .NET по умолчанию кодировкой заголовка ответа является utf-8, измените ее на iso-8859-1.Измените web.config для того же, как показано ниже,

<globalization responseHeaderEncoding="iso-8859-1" .../>

И код был бы,

    //apply Response header's encoding i.e. iso-8859-1 to the filename.
    Dim fileName as String = "在庫あり全商品を24時間以内に出荷.doc" 
    Dim enc As Encoding = Encoding.GetEncoding("shift_jis") 
    Dim dec As Encoding = Encoding.GetEncoding("iso-8859-1")
    fileName = dec.GetString(enc.GetBytes(fileName))

    //Show Download Dialog box and Writting it on Client Side.
    Response.ClearHeaders() 
    Response.ContentType = corspBean.ContentType 
    Response.AppendHeader("content-disposition", "attachment; filename=""" + fileName + """") 
    Response.BinaryWrite(bytes) 
    Response.End()

Теперь, еще одна важная вещь, из-за которой я потратил впустую много времени, это это не работает на ASP.NET Сервере разработки то есть сервер, который вы используете для тестирования / отладки веб-приложений на вашем локальном компьютере.Итак, разверните решение в IIS и протестируйте оттуда.Это прекрасно работает в IIS.(и IIS - это судьба каждого ASP.NET приложения;) поэтому не имеет значения, работает ли оно на ASP.NET Сервере разработки или нет)

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