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);
    
            }
  • 相关阅读:
    交通运输线(LCA)
    POJ 2186 Popular cows(Kosaraju+强联通分量模板)
    Codeforces 351D Jeff and Removing Periods(莫队+区间等差数列更新)
    Codeforces 375D
    Codeforces 86D
    SPOJ D-query(莫队算法模板)
    Educational Codeforces Round 25 D
    Codeforces Round #423 Div. 2 C-String Reconstruction(思维)
    HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)
    bzoj 2463: [中山市选2009]谁能赢呢?
  • 原文地址:https://www.cnblogs.com/chzbgb/p/6805255.html
Copyright © 2011-2022 走看看