2009-09-16 7 views
2

현재 ASP .NET 응용 프로그램 용으로 Visual Studio 2008을 사용하고 있습니다. Response 개체를 통해 Excel 파일을 서버에 보내려고합니다. 문제는 파일의 제목을 일본어로 설정할 수없는 것입니다. 일본어 파일 이름으로 설정하면 가비지 문자로 반환됩니다. 일본어 WinXP에서 일본어 IE 브라우저를 사용하고 있습니다.ASP .NET 일본어 파일 이름의 파일 다운로드

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"))); 

는 이미

Response.Charset = "Shift_JIS"; 

또는

Response.Charset = "sjis"; 

어떤 아이디어-JIS 시프트하는 인코딩을 변경하려고? Btw, Visual Studio 2005에서도 동일한 문제가있었습니다.

답변

4

저는 ASP 전문가는 아니지만 UrlEncode를 사용하여 파일 이름을 레코딩 해 보았습니까?

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

저는 이것을 믿지 않습니다. 그것은 효과가 있었다. – Nap

+0

임시 폴더에서 열린 파일 이름이 유니 코드로 인코딩 된 이름으로 설정되는 것을 방지하기 위해이 솔루션을 Java에서 보았습니다. 문자열 fileName = "데이터 출력 .txt"; HttpServletResponse response = requestCondition.getResponse(); response.setContentType ("application/plain"); 문자열 dFilename = 새 문자열 (fileName.getBytes ("Windows-31J"), "ISO-8859-1"); response.setHeader ("Content-Disposition", "attachment; filename ="+ dFilename); response.setCharacterEncoding ("WINDOWS-932"); – Nap

2

Response.Charset은 HTTP 요청 본문에만 해당됩니다. the HTTP spec에 따르면 머리글은 ISO-8859-1로 암시 적으로 인코딩됩니다. 인코딩 외부의 문자는 MIME-encoded이어야합니다.

이것은 논리적 인 것이며 결국에는 Response.Charset으로 설정된 본문 인코딩 자체가 헤더에 지정됩니다.

2

가 나는 :)이

System.Web.HttpUtility.UrlPathEncode의 사용은 쓰레기 문제를 해결하지만, 당신이 파일을 열 때, 대신 실제 일본어 문자의 파일 이름에 유니 코드 코드화되지 않은 이름을 보여줍니다 ... 마지막으로, 작업을 얻었다. (음 IE7과 IE6의 문제입니다. UrlPathEncode는 IE8에서 정상적으로 작동합니다.)

따라서 System.Web.HttpUtility.UrlPathEncode을 사용하는 대신 Response 헤더에 사용 된 인코딩을 사용하여 filname을 디코딩해야합니다.

.NET에서 기본적으로 Response 헤더의 인코딩은 utf-8이므로 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() 

지금, 하나 개 더 중요한 것은이, 내가 그것 때문에 많은 시간을 낭비, 아래 그림과 같이, 같은 대한

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

을에서 web.config를 수정하고 코드가 될 것이다 이것은 ASP.NET 개발 서버, 즉 로컬 컴퓨터에서 웹 응용 프로그램을 테스트/디버깅하는 데 사용하는 서버에서 작동하지 않습니다. 따라서 IIS에 솔루션을 배포하고 거기에서 테스트하십시오. IIS에서 완벽하게 작동합니다. (그리고 IIS는 모든 ASP.NET 응용 프로그램의 운명입니다.) ASP.NET 개발 서버에서 작동하는지 여부는 중요하지 않습니다.)