如何自动判断Request.QueryString参数的编码格式如下:?va=%e4%b8%ad%e5%9b%bd(UTF8格式)
?va=%d6%d0%b9%fa(GB2312格式)如何都能得到我想要的结果
?va=中国就是 不过传过来的参数是 UTF8格式 还是 GB2312格式,我都能得到正确的结果
?va=%d6%d0%b9%fa(GB2312格式)如何都能得到我想要的结果
?va=中国就是 不过传过来的参数是 UTF8格式 还是 GB2312格式,我都能得到正确的结果
官僚主义!!
我的意思是 不过那边传什么编码的 参数 我都 可以正常接收参考: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 都辨认出来了是中国
这个只能认 GB2312 编码的
如果是 UTF8 这个 转换是错误的
要判断出来都是很麻烦的事情。我觉得你这个需求比较悬,我留言等神仙出现,呵呵呵。
有一点我认为 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)不同编码 区间是不同的就是想不到好的方法 获得 编码
能就 同TRY,报错,就换另一个
//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;
}
}
http://blog.csdn.net/maotree/archive/2009/11/05/4773393.aspx
很想知道你是知道接收到原始串的?
Request.ServerVariables 是不会自动转码的 而 Request.QueryString 会转的面目全飞
string s=Request.QueryString["name"].ToString();参考
就是 vs2008 IIS6.0 win2003
这个和环境没关系的这个方法我用在 UrlRewiter 的转向里所有的我都使用了伪静态页
所以参数传递是一个问题,因为 在处理后的页面 如果参数是 GB2312 使用QueryString 获取参数的时候就会出问题我发一个帖子 帖出 UrlRewiter 中的应用
我解决问题的初衷不是改变我这里的编码而是 想办法去兼容GB2312和UTF8 两种编码
我对代码进行了些许封装,解决楼主21楼所说的问题,看是否可以满足楼主需求
http://www.cnblogs.com/zhujie/archive/2010/09/16/1827910.html
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
/// <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=中国