zoukankan      html  css  js  c++  java
  • Asp.net 文件下载,中文文件名出现乱码(转载)

    最近在Asp.net项目中遇到一个问题,实现文件下载时,英文文件名的文件下载时,文件名显示正常,但是如果文件名为中文则显示乱码。
     
     
     
    在网上google了一下,找到这编文章:解决用ASP.NET下载文件时,文件名为乱码的问题
     
    string encodefileName= System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); //通过使用HttpUtility.UrlEncode()来对原始文件名进行编码,以解决文件名乱码
    Response.AppendHeader("content-disposition", "attachment;filename=" + encodefileName);//附件下载

    但是以上这个方案,存在一个问题:就是如果文件名中有空格则空格变成了“+” 号,其他特殊字符尚未测试,有可能还存在其他问题。

     

    再次使用google,终于找到老外的一编文章:Display a non-US-ASCII filename in File Download dialog box

    他使用如下code解决问题:

    string encodefileName=ToHexString(fileName);       //使用自定义的ToHexString()方法,编码原始文件名

    Response.AppendHeader("content-disposition", "attachment;filename=" + encodefileName);
     
            /// <summary>
            /// Encodes non-US-ASCII characters in a string.
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            public static string ToHexString(string s)
            {
                char[] chars = s.ToCharArray();
                StringBuilder builder = new StringBuilder();
                for (int index = 0; index < chars.Length; index++)
                {
                    bool needToEncode = NeedToEncode(chars[index]);
                    if (needToEncode)
                    {
                        string encodedString = ToHexString(chars[index]);
                        builder.Append(encodedString);
                    }
                    else
                    {
                        builder.Append(chars[index]);
                    }
                }

                return builder.ToString();
            }

            /// <summary>
            /// Determines if the character needs to be encoded.
            /// </summary>
            /// <param name="chr"></param>
            /// <returns></returns>
            private static bool NeedToEncode(char chr)
            {
                string reservedChars = "$-_.+!*'(),@=&";

                if (chr > 127)
                    return true;
                if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
                    return false;

                return true;
            }

            /// <summary>
            /// Encodes a non-US-ASCII character.
            /// </summary>
            /// <param name="chr"></param>
            /// <returns></returns>
            private static string ToHexString(char chr)
            {
                UTF8Encoding utf8 = new UTF8Encoding();
                byte[] encodedBytes = utf8.GetBytes(chr.ToString());
                StringBuilder builder = new StringBuilder();
                for (int index = 0; index < encodedBytes.Length; index++)
                {
                    builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));
                }

                return builder.ToString();
            }


     

  • 相关阅读:
    一条软件缺陷(或者叫 Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    测试人员在软件开发过程中的任务
    HDOJ1754(线段树)
    HDOJ1166(线段树,树状数组)
    分治法
    POJ1840(哈希)
    HOOJ1290 2050(递推)
    POJ1035(字符串)
    HDOJ1800(哈希)
    POJ2299(归并排序)
  • 原文地址:https://www.cnblogs.com/xiaoqiangR/p/2216018.html
Copyright © 2011-2022 走看看