对UTF-8和GB2312格式 URL进行解码
对UTF-8和GB2312格式 URL进行解码
新的系统编码格式是:UTF-8
老的页面编码格式是: GB2312
新的系统的URL参数(带中文) 提交到老的系统中,中文参数是乱码。
解决思路1,在新的系统中传递的时候使用JS进行解码,然后再编码。这种方案,和浏览器本身传参无区别。所以,在使用这种方案后,在老的系统中解码,依然解决不了问题。
简单写一下实现的伪代码
传参的时候,使用JS 编码:
location.href="old.aspx?word="+encodeURI('中文')
老的页面解码:
Server.UrlDecode(Request["word"]);
最终还是乱码。
最终看了一下编过的汉字:“中文”
UTF-8下:
JS编码过的如下: %E4%B8%AD%E5%9B%BD
浏览器FORM提交的如下:%E4%B8%AD%E5%9B%BD
GB2312:
JS编码格式如下: %E4%B8%AD%E5%9B%BD
浏览器FORM提交的如下:%D6%D0%B9%FA
说明,使用JS编码模式都是将字符串用UTF-8模式下编码。
如果这样子的话,那我使用JS编码传参,后台都采用UTF-8进行解码就可以了。(这种思路未测试,我自己使用的是思路2)
HttpUtility.UrlDecode(strEncode, Encoding.UTF8); //判断编码格式 UTF-8
解决思路2,
既然是解码的问题,那我就要针对传过来的的字符串进行判断,然后进行相应的格式进行解码。
(1).判断其编码格式。
(2).再解码。
代码如下:
//string strEncode =Request["word"]; //解码的时候这样子获取参数是有问题的,这样获取参数,无论怎么转都是乱码。应用下面的这种方式
string strEncode =GetWord( Request.ServerVariables["QUERY_STRING"]);
if (IsUTF8(strEncode)) result = HttpUtility.UrlDecode(strEncode, Encoding.UTF8); //判断编码格式 UTF-8 else result = HttpUtility.UrlDecode(strEncode, Encoding.GetEncoding("GB2312")); ////判断编码格式 GB2312
/// <summary> /// 获取word参数 /// </summary> /// <param name="value"></param> /// <returns></returns> private string GetWord(string value) { if (string.IsNullOrEmpty(value)) return ""; string[] array = value.Split('&'); string strEncode = ""; for (int i = 0; i < array.Length; i++) { if (array[i].IndexOf("word=") >= 0) { strEncode = array[i].Replace("word=", ""); break; } } return strEncode; } /// <summary> /// 获取字符的字节 /// </summary> /// <param name="url"></param> /// <returns></returns> private static byte[] GetUrlCodingToBytes(string url) { StringBuilder sb = new StringBuilder(); int i = url.IndexOf('%'); while (i >= 0) { if (url.Length < i + 3) { break; } sb.Append(url.Substring(i, 3)); url = url.Substring(i + 3); i = url.IndexOf('%'); } string urlCoding = sb.ToString(); if (string.IsNullOrEmpty(urlCoding)) return new byte[0]; urlCoding = urlCoding.Replace("%", string.Empty); int len = urlCoding.Length / 2; byte[] result = new byte[len]; len *= 2; for (int index = 0; index < len; index++) { string s = urlCoding.Substring(index, 2); int b = int.Parse(s, System.Globalization.NumberStyles.HexNumber); result[index / 2] = (byte)b; index++; } return result; } /// <summary> /// 判断字符是否为UTF-8 /// </summary> /// <param name="url"></param> /// <returns></returns> private static bool IsUTF8(string url) { byte[] buf = GetUrlCodingToBytes(url); 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; }
今天,遇到一个问题,MVC项目中,一个AJAX请求的问题,又是乱码。肯定又是编码的东西,搞的人难受。其实很简答,一个文本框,输入一个值。AJAX请求一下,看是否存在,如果存在就清空。看前任写的代码,
function checkUnitName(unitName) { if (unitName != "") { $.get("/Manage/Product/CheckUnitName", { pUnitName: encodeURI(unitName) }, function (data) { if (data == "0") { alert("单位名称已经存在,请选择"); $("#UnitName").val(""); } }); } }
public static string UNEscape(string str) { string outstr = ""; #region 老方法 if (!string.IsNullOrEmpty(str)) { string[] strlist = str.Replace("%", "").Split('u'); try { for (int i = 1; i < strlist.Length; i++) { //将unicode字符转为10进制整数,然后转为char中文字符 outstr += (char)int.Parse(strlist[i].Substring(0, 4), System.Globalization.NumberStyles.HexNumber); } } catch (FormatException ex) { outstr = ex.Message; } } #endregion return outstr; }
这个方法基本没派上用场,执行过后,返回为 空字符串。
其实就这一句话就搞定了。
public static string UNEscape(string str) { string outstr = outstr = HttpUtility.UrlDecode(str, Encoding.UTF8); return outstr; }
问题点是:
AJAX乱码问题
从网上查资料得知,
1、xtmlhttp 返回的数据默认的字符编码是utf-8,
2、post方法提交数据默认的字符编码是utf-8, (get也是的,自己就是使用get方式)
因为我这个项目是使用GB2312的编码格式,AJAX (UTF-8) 的模式传到后台,就会出现乱码了。明白了其中的道理,问题就好解决了。
————————————————
版权声明:本文为CSDN博主「七色鸟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/vincent_void/article/details/7739094