zoukankan      html  css  js  c++  java
  • 下载文件乱码问题,并提供转码方法

    不知大家遇没遇到过这种情况,大多数浏览器下载文件时,弹出的下载框上的文件名都是正常,唯独火狐或IE文件名显示乱码,这种情况一般不用解决,直接下载下来就行了,因为内容不是乱码,可以正常阅读取用,不过如果遇到特别较真的,特别爱钻牛角尖的朋友呢?不解决睡不着觉呀,为了挽救这些爱钻牛角尖的朋友,列出如下代码:

    直接调用ToHexString(string s)方法即可:

    protected void Page_Load(object sender, EventArgs e)
            {
                DocControl dc = new DocControl();
    
                File file = dc.GetFile(FileID);
                if (file == null) return;
                if (!System.IO.File.Exists(System.IO.Path.Combine(HttpPath, file.FilePath)))
                {
                    Response.Write("文件不存在");
                    Response.End();
                }
                byte[] filesoure = System.IO.File.ReadAllBytes(System.IO.Path.Combine(HttpPath, file.FilePath));
                if (filesoure != null)
                {
                    string _fileExtension = file.FileExtension.Substring(1);
                    Response.ContentType = _fileExtension;
    
                    string _fileName = file.FleName;
                    if (Request.UserAgent.Contains("MSIE 7.0") || Request.UserAgent.Contains("msie 7.0"))
                    {
                        if (_fileName.Length > 16)
                            _fileName = _fileName.Substring(0, 12) + "." + _fileExtension;
                    }
                    _fileName = ToHexString(_fileName);
    
                    Response.AddHeader("content-disposition", "inline;filename=" + _fileName);
                    Response.AppendHeader("Content-Type", _fileExtension);
                    Response.AddHeader("Content-Length", "" + filesoure.Length);
                    Response.BinaryWrite(filesoure);
                    Response.Flush();
                    Response.End();
                }
    
            }
    
    
    
    /// <summary>
            /// 为字符串中的非英文字符编码        /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            public 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>
            ///指定 一个字符是否应该被编码
            /// </summary>
            /// <param name="chr"></param>
            /// <returns></returns>
            private bool NeedToEncode(char chr)
            {
                string reservedChars = "$-_.+!*'(),@=&";
                if (chr > 127)
                    return true;
                if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
                    return false;
                return true;
            }
            /// <summary>
            /// 为非英文字符串编码        /// </summary>
            /// <param name="chr"></param>
            /// <returns></returns>
            private 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();
            }
    
            private string NewString(string str)
            {
                string filename = System.IO.Path.GetFileNameWithoutExtension(str);
                return ToHexString(filename);
    
            }
  • 相关阅读:
    机器学习: t-Stochastic Neighbor Embedding 降维算法 (二)
    数学辨异 —— 泰勒展开与等比数列求和
    HDU 4705 Y
    C#实现的内存分页机制的一个实例
    java程序获得SqlServer数据表的表结构
    GLSL中的各种变量总结
    HTTP协议学习
    Jedis中的一致性hash
    C语言数据结构----双向链表
    ios7毛玻璃效果实现
  • 原文地址:https://www.cnblogs.com/chzbgb/p/6805255.html
Copyright © 2011-2022 走看看