zoukankan      html  css  js  c++  java
  • 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());
    

      

  • 相关阅读:
    窗内的星星
    亚特兰蒂斯
    你能回答这些问题吗
    区间最大公约数
    集训队8月14日(树状数组)
    一个简单的整数问题2
    谜一样的牛
    楼兰图腾
    Eternal Victory
    集训队8月12日(并查集)
  • 原文地址:https://www.cnblogs.com/daner1257/p/4377912.html
Copyright © 2011-2022 走看看