ASP .NET скачать файл с японским именем файла - PullRequest
2 голосов
/ 16 сентября 2009

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

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

OR

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

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

Response.Charset = "Shift_JIS";

или

Response.Charset = "sjis";

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

Ответы [ 3 ]

4 голосов
/ 16 сентября 2009

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

Response.AddHeader("Content-Disposition",
    System.Web.HttpUtility.UrlEncode(String.Format("attachment; filename=\"{0}\"", "日本語.xls")));
2 голосов
/ 03 июня 2010

у меня все заработало, наконец-то ...:)

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

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

В .NET по умолчанию кодировка заголовка Response - 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 Development Server , т.е. на сервере, который вы используете для тестирования / отладки веб-приложений. на вашей локальной машине. Итак, разверните решение на IIS и протестируйте оттуда. Он отлично работает на IIS. (а IIS - это судьба каждого приложения ASP.NET;) поэтому не имеет значения, работает оно на сервере разработки ASP.NET или нет)

2 голосов
/ 16 сентября 2009

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

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

...