C#導出Excel文件Firefox中文件名亂碼


首先說明下:我的解決方法不一定適用於其他遇到該問題的人,因為情況多種多樣,適合我的方法不一定適合別人,就像我在遇到問題時查到別人的解決方案放到我的代碼里卻不管用,所以這個方法僅供參考

這兩天做了一個導出數據到Excel功能,用NPOI導出,但是在最后步驟出了一點小岔子,導出文件的名稱在火狐里面顯示的是亂碼,在谷歌和IE里面均正常,這尼瑪~~~瞬間想把火狐給千刀萬剮了有木有!!當然光生氣是沒什么用的,問題總是要解決的。雖然用戶基本不用火狐瀏覽網站,但是留這么一個問題在也不合適是不是,所以就找原因,csdn上一位博主寫了一個解決辦法(傳送門),但是我用過后發現不管用,不知道是不是我的情況特殊,也有在百度上看到火狐官方的回答是讓設置文件編碼,不過也沒用,后來在百度知道上看到另一個大神說不需要編碼,於是試了一下,發現火狐是OK了,但是谷歌和IE卻抽了,無奈只好做了一個判斷,對火狐特殊處理,具體代碼如下:

 1 //這里判斷使用的瀏覽器是否為Firefox,Firefox導出文件時不需要對文件名顯示編碼,編碼后文件名會亂碼
 2         //但是IE和Google需要編碼才能保持文件名正常
 3         if (baseContext.Request.ServerVariables["http_user_agent"].ToString().IndexOf("Firefox") != -1)
 4         {
 5             baseContext.Response.AddHeader("Content-Disposition", "attachment;filename="
 6                 + sFileName);
 7         }
 8         else
 9         {
10             baseContext.Response.AddHeader("Content-Disposition", "attachment;filename="
11                 + System.Web.HttpUtility.UrlEncode(sFileName, System.Text.Encoding.UTF8));
12         }
判斷瀏覽器分開處理

遇到同樣問題的朋友可以試試

~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~

解決這個問題之后,滿心歡喜,但是我沒想到后面還有更大的坑在等着我去跳,火狐里面中文倒是可以了,由於我們網站是多語系,有簡繁英越四個語言,導出英文和越文時,字之間的空格都顯示成了+號,並且在IE和谷歌里面越語的時候也會出啊先瞬間就傻眼了,這是什么玩意兒?無奈只好又查資料,同事幫我找到一個解決方案,具體地址在這里,原因是經過HttpUtility.UrlEncode方法加密過文件名后該方法將空格替換成了+號,用%20替換掉就可以正常顯示了,但是這個方法在IE和谷歌里面可以解決問題,在火狐里面仍然無效,用%20替換+后輸出的就是%20,並不會顯示為空格,真心是給火狐跪了啊,各種糾結,最后還是那個同事幫我找到一篇一個Java工程師寫的解決方案,具體地址在這里,於是抱着試試看的態度用C#試了下,結果完美解決所有語言的亂碼問題,唉,真是被火狐搞死了,到此這個功能總算完善了,最后還是把具體的代碼發出來吧

string sFileName =  "XXXXXX.xls";       
        if (baseContext.Request.ServerVariables["http_user_agent"].ToString().IndexOf("Firefox") != -1)
        {
            sFileName = "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sFileName)) + "?=";         
        }
        else
        {
            sFileName = System.Web.HttpUtility.UrlEncode(sFileName, System.Text.Encoding.UTF8);
            sFileName = sFileName.Replace("+", "%20");
        }
        baseContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + sFileName);
        baseContext.Response.AddHeader("Content-Length", ms.Length.ToString());
        baseContext.Response.AddHeader("Content-Transfer-Encoding", "binary");
        baseContext.Response.ContentType = "application/octet-stream;charset=utf-8";
        baseContext.Response.ContentEncoding = System.Text.Encoding.UTF8;   
        baseContext.Response.BinaryWrite(ms.ToArray());

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM