如何自动判断Request.QueryString参数的编码格式如下:?va=%e4%b8%ad%e5%9b%bd(UTF8格式)
?va=%d6%d0%b9%fa(GB2312格式)如何都能得到我想要的结果
?va=中国就是 不过传过来的参数是 UTF8格式 还是 GB2312格式,我都能得到正确的结果

解决方案 »

  1.   

    Server.UrlDecode真是的,一个团队的,还不沟通好!!
    官僚主义!!
      

  2.   


    我的意思是 不过那边传什么编码的 参数 我都 可以正常接收参考:GOOGLE
    http://www.google.cn/search?hl=zh-CN&q=%e4%b8%ad%e5%9b%bdhttp://www.google.cn/search?hl=zh-CN&q=%d6%d0%b9%faGOOGLE 都辨认出来了是中国
      

  3.   


    这个只能认 GB2312 编码的
    如果是 UTF8 这个 转换是错误的
      

  4.   

    你不能拿Google来比,我怀疑(个人怀疑,我觉得如果我是做GOOGLE的一定这样做)这两种编码的结果是早就预备好的,也就是本身Google就是预备了很多种编码格式的搜索结果。而非搜索引擎公司一般做不到这个程度。关于编码格式自动识别这个问题,别说你只是一个字符串,就算你是一个完整的带签名文件,
    要判断出来都是很麻烦的事情。我觉得你这个需求比较悬,我留言等神仙出现,呵呵呵。
      

  5.   


    有一点我认为 GOOGLE 不会把什么都弄成多份 毕竟是海量数据 
    两份结果 以为着 数据中心的翻番 这个是 GOOGLE 绝对不会做的//0000 0000-0000 007F - 0xxxxxxx  (ascii converts to 1 octet!)
    //0000 0080-0000 07FF - 110xxxxx 10xxxxxx    ( 2 octet format)
    //0000 0800-0000 FFFF - 1110xxxx 10xxxxxx 10xxxxxx (3 octet format)不同编码 区间是不同的就是想不到好的方法 获得 编码
      

  6.   

    接收别的站点传来的数据,怎么还有这样的需求呢,还不弄成service
      

  7.   

    貌似是不行判别的。我可以断言,如果知道Google的实现方式,那我们可以肯定的知道他的实现方式肯定不是完美的。。
      

  8.   

    传2参数一个标记什么格式!TRY 能抓取 错误转化??
    能就 同TRY,报错,就换另一个
      

  9.   

    这个是行不通的 一般面对这种接口 必须有一个接口文档。同时要就编码格式。我们得到数据 是不能判断其编码格式的。不过你可以叫他一起把编码格式页传过来  后面再加上 Decode=utf
      

  10.   

    发个我同学帮我写的    class MyEncoding {        static void Main() {
                //GB2312
                string str1 = "%d6%d0%b9%fa";
                //utf8
                string str2 = "%e4%b8%ad%e5%9b%bd";            Console.WriteLine(string.Format("str1 is utf8: {0}.", IsUTF8(FromHexString(str1)).ToString()));
                Console.WriteLine(string.Format("str2 is utf8: {0}.", IsUTF8(FromHexString(str2)).ToString()));            string str = Encoding.GetEncoding("gb2312").GetString(FromHexString(str1));
                Console.WriteLine(string.Format("Convert str1 to utf8 encoding is {0}.", ToHexString(System.Text.Encoding.UTF8.GetBytes(str))));            Console.ReadLine();
            }        static string ToHexString(byte[] binary) {
                StringBuilder str = new StringBuilder();
                foreach (byte b in binary) {
                    if (b > 15)
                        str.AppendFormat("{0:X}", b);
                    else
                        str.AppendFormat("0{0:X}", b);
                }            return str.ToString();
            }        static byte[] FromHexString(string hex) {
                if (hex == null || hex.Length < 1)
                    return new byte[0];            hex = hex.Replace("%", string.Empty);
                int len = hex.Length / 2;
                byte[] result = new byte[len];
                len *= 2;            for (int index = 0; index < len; index++) {
                    string s = hex.Substring(index, 2);
                    int b = int.Parse(s, System.Globalization.NumberStyles.HexNumber);
                    result[index / 2] = (byte)b;
                    index++;
                }            return result;
            }        private static bool IsUTF8(byte[] buf) {
                int i;
                byte cOctets;  // octets to go in this UTF-8 encoded character 
                bool bAllAscii = true;
                long iLen = buf.Length;            cOctets = 0;
                for (i = 0; i < iLen; i++) {
                    if ((buf[i] & 0x80) != 0) bAllAscii = false;                if (cOctets == 0) {
                        if (buf[i] >= 0x80) {
                            do {
                                buf[i] <<= 1;
                                cOctets++;
                            }
                            while ((buf[i] & 0x80) != 0);                        cOctets--;
                            if (cOctets == 0)
                                return false;
                        }
                    } else {
                        if ((buf[i] & 0xC0) != 0x80)
                            return false;                    cOctets--;
                    }
                }            if (cOctets > 0)
                    return false;            if (bAllAscii)
                    return false;            return true;
            }
        }
      

  11.   

    地址:
    http://blog.csdn.net/maotree/archive/2009/11/05/4773393.aspx
      

  12.   

    context.Request.ServerVariables["QUERY_STRING"] 在httpHander里面就已经面目全非了
    很想知道你是知道接收到原始串的?
      

  13.   


    Request.ServerVariables 是不会自动转码的 而 Request.QueryString 会转的面目全飞
      

  14.   

    难道.net或是IIS版本不同?我在vs2008里面调试不行。
      

  15.   

    <globalization fileEncoding="GB2312"  requestEncoding="GB2312"  responseEncoding="GB2312"/>
    string s=Request.QueryString["name"].ToString();参考
      

  16.   


    就是 vs2008 IIS6.0 win2003 
    这个和环境没关系的这个方法我用在 UrlRewiter 的转向里所有的我都使用了伪静态页 
    所以参数传递是一个问题,因为 在处理后的页面 如果参数是 GB2312 使用QueryString 获取参数的时候就会出问题我发一个帖子 帖出  UrlRewiter  中的应用
      

  17.   


    我解决问题的初衷不是改变我这里的编码而是 想办法去兼容GB2312和UTF8 两种编码
      

  18.   

    谢谢,原来在httpModule中可以获取原始串
      

  19.   

    18楼的代码只能对编码后的串进行判断。
    我对代码进行了些许封装,解决楼主21楼所说的问题,看是否可以满足楼主需求
    http://www.cnblogs.com/zhujie/archive/2010/09/16/1827910.html
      

  20.   

    又发现一个问题,请求头中可以包含编码格式,但仅限于POST提交的信息部分的编码格式,而同一个请求中,get提交部分的编码格式似乎可以不同
      

  21.   

    Private Shared Function IsUTF8(ByVal zstr As String) As Boolean
            Dim mystr As String = HttpUtility.UrlDecode(zstr, Encoding.UTF8)
            Dim utf8len As Int32 = 0
            Dim gblen As Int32
            For i = 0 To mystr.Length - 1
                tint = AscW(mystr(i))                                
                If tint > 255 Then
                    If tint > 12295 And tint < 40870 Then    '判断字符属于常用汉字还是乱码。
                        utf8len = utf8len + 1               ’若属于常用汉字,则UTF8的可能性+1
                    Else
                        gblen = gblen + 1                   ’若不属于常用字符串,则GB2312的可能性+1
                    End If
                End If
            Next
            If gblen > utf8len Then                         '最后比较UTF8以及GB2312哪个的可能性大。
                Return False
            Else
                Return True
            End If
        End Function
      

  22.   


        /// <summary>
        /// 解析URL(可以正确识别UTF-8和GB2312编码)
        /// </summary>
        /// <param name="uriString"></param>
        /// <returns></returns>
        public static string DecodeURL(String uriString)
        {
            //正则1:^(?:[\x00-\x7f]|[\xe0-\xef][\x80-\xbf]{2})+$ 
            //正则2:^(?:[\x00-\x7f]|[\xfc-\xff][\x80-\xbf]{5}|[\xf8-\xfb][\x80-\xbf]{4}|[\xf0-\xf7][\x80-\xbf]{3}|[\xe0-\xef][\x80-\xbf]{2}|[\xc0-\xdf][\x80-\xbf])+$
            //如果不考虑哪些什么拉丁文啊,希腊文啊乱七八糟的外文,用短的正则,即正则1
            //如果考虑哪些什么拉丁文啊,希腊文啊乱七八糟的外文,用长的正则,即正则2
            //本方法使用的正则1
            if (Regex.IsMatch(HttpUtility.UrlDecode(uriString, Encoding.GetEncoding("iso-8859-1")), @"^(?:[\x00-\x7f]|[\xe0-\xef][\x80-\xbf]{2})+$"))
            {
                return HttpUtility.UrlDecode(uriString, Encoding.GetEncoding("UTF-8"));
            }
            else
            {
                return HttpUtility.UrlDecode(uriString, Encoding.GetEncoding("GB2312"));
            }
        }    protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("(UTF8格式)" + DecodeURL("va=%e4%b8%ad%e5%9b%bd")+"<br>");
            Response.Write("(GB2312格式)" + DecodeURL("va=%d6%d0%b9%fa"));
        }输出:(UTF8格式)va=中国 <br>
    (GB2312格式)va=中国