Asp.Net 编码和解码

     最近因为项目需要,做了一个投票的页面(Html,比如A 页面),要把它Post到一个Aspx页面(比如B页面),在这个Aspx页面上,需要确认一下,在提交到数据库,可是问题出来了,用户在A页面上点击SubmitPostB页面上的时候,在B页面用Request.Form[ID],接收,但是显示时,有时候是乱码,有的时候却是正常的,不知道为什么,在网上查了一些资料,看了一些编码的文章,感觉出现问题的原因是这样的,A页面虽然在开始有一句<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />,但是用户用的机器上的编码可能是UTF或者GB的,在用户Post的时候,是用用户自己上的编码格式编的码(我的理解),从而在Request的时候就已经成乱码了。一开始,我想两种办法,一种是用Url编码,比如我们在A页面上有一个Input : <input type="radio" id="IsRightSee_2" name="radiobuttonIsRightSee" value="音、视频播放不连续" />音、视频播放不连续,我们把它的ValueUrl编码,变成<input type="radio" id="IsRightSee_2" name="radiobuttonIsRightSee" value="%e%d..之类的" />音、视频播放不连续,在B页面用Request[“radiobuttonIsRightSee”],得到Value,然后再对这个Value解码,可是出乎我的意料的是,用这个办法得到的也是乱码。碰壁后只有用第二种方案,就是用Unicode对其编码因为原先我没有遇到编码解码问题,所以就在网上搜索资源,但是与其相关的都没有一个好的解决方案,只搜到一个汉字转Unicode的工具,把其下载下来,先做了一个测试,对上文中的音、视频播放不连续”,进行编码,得到“\u97F3\u3001\u89C6\u9891\u64AD\u653E\u4E0D\u8FDE\u7EED”,然后再B页面上在对这个Value解码,果然,没有成乱码,看到这得你会不会想到,我怎么对这一串进行解码的,这个工具又没有源代码,其实这个工具是用.Net写的,.Net写的我们就有办法看里边的源代码了,只要他没有对源代码加密,用Reflector就行。解码的源代码如下:
 private string NormalU2C(string input)
    
{
        
string str = "";
        
char[] chArray = input.ToCharArray();
        Encoding bigEndianUnicode 
= Encoding.BigEndianUnicode;
        
for (int i = 0; i < chArray.Length; i++)
        
{
            
char ch = chArray[i];
            
if (ch.Equals('\\'))
            
{
                i
++;
                i
++;
                
char[] chArray2 = new char[4];
                
int index = 0;
                index 
= 0;
                
while ((index < 4&& (i < chArray.Length))
                
{
                    chArray2[index] 
= chArray[i];
                    index
++;
                    i
++;
                }

                
if (index == 4)
                
{
                    
try
                    
{
                        str 
= str + this.UnicodeCode2Str(chArray2);
                    }

                    
catch (Exception)
                    
{
                        str 
= str + @"\u";
                        
for (int j = 0; j < index; j++)
                        
{
                            str 
= str + chArray2[j];
                        }

                    }

                    i
--;
                }

                
else
                
{
                    str 
= str + @"\u";
                    
for (int k = 0; k < index; k++)
                    
{
                        str 
= str + chArray2[k];
                    }

                }

            }

            
else
            
{
                str 
= str + ch.ToString();
            }

        }

        
return str;
    }

    
private string UnicodeCode2Str(char[] u4)
    
{
        
if (u4.Length < 4)
        
{
            
throw new Exception("It's not a unicode code array");
        }

        
string str = "0123456789ABCDEF";
        
char ch = char.ToUpper(u4[0]);
        
char ch2 = char.ToUpper(u4[1]);
        
char ch3 = char.ToUpper(u4[2]);
        
char ch4 = char.ToUpper(u4[3]);
        
int index = str.IndexOf(ch);
        
int num2 = str.IndexOf(ch2);
        
int num3 = str.IndexOf(ch3);
        
int num4 = str.IndexOf(ch4);
        
if (((index == -1|| (num2 == -1)) || ((num3 == -1|| (num4 == -1)))
        
{
            
throw new Exception("It's not a unicode code array");
        }

        
byte num5 = (byte)(((index * 0x10+ num2) & 0xff);
        
byte num6 = (byte)(((num3 * 0x10+ num4) & 0xff);
        
byte[] bytes = new byte[] { num5, num6 };
        
return Encoding.BigEndianUnicode.GetString(bytes);
    }

  写到这里问题基本上解决了,可是如果您的页面上有n多的input ,你还用这个工具一个input,一个input,把其中的Value Copy –Convert-Parse,到你的页面上吗?其实我们可以写一个正则表达式,用正则表达式来找出input中的Value,然后编码之后,在把原先的Value替换成编码后的Value,这样的话,即省了功夫,又不会出错(除非你的正则有问题),如果你不清楚怎么写的话,见一下代码:
protected void Button1_Click(object sender, EventArgs e)
    
{
        
string strPatter = @"(<input\s*[^>]*value\s*=\s*"")([^""]*)("".*?/>)";
         //txtcontent为需要替换的
         //txtresult为结果
        Regex rgx 
= new Regex(strPatter, RegexOptions.Multiline);
        
this.txtresult.Text = rgx.Replace(txtcontent.Text, new MatchEvaluator(Encode));
    }

    
//调用委托
    private string Encode(Match m)
    
{
        
string strValue1 = m.Groups[1].Value;
        
string strValue2 = m.Groups[2].Value;
        
string strValue3 = m.Groups[3].Value;

        
return strValue1 + EncodeUniCode(strValue2) + strValue3;
    }

    
//对中文编码成Unicode
    private string EncodeUniCode(string input)
    
{
        Encoding bigEndianUnicode 
= Encoding.BigEndianUnicode;
        
char[] chArray = input.ToCharArray();
        
string str = "";
        
foreach (char ch in chArray)
        
{
            
if (ch.Equals('\r'|| ch.Equals('\n'))
            
{
                str 
= str + ch;
            }

            
else
            
{
                
byte[] bytes = bigEndianUnicode.GetBytes(new char[] { ch });
                str 
= (str + @"\u"+ string.Format("{0:X2}", bytes[0]) + string.Format("{0:X2}", bytes[1]);
            }

        }

        
return str;
    }



     编码工具下载
posted @ 2008-04-16 19:37 兴百放 阅读(368) 评论(8)  编辑 收藏 网摘 所属分类: [1][Asp.Net

  回复  引用  查看    
#1楼 2008-11-15 17:43 | 余魁      
哎,我接收过来的编码别人把%去掉了,那我要怎么解码?
可否帮忙??
  回复  引用  查看    
#2楼 2008-11-19 08:14 | 余魁      
没有人啦????
  回复  引用  查看    
#3楼 [楼主]2008-11-19 09:30 | 兴百放      
@余魁
呵呵
不好意思,这几天有点忙,没来看 ,sorry

如果有%,那么可能就是URL编码了,并且要编码的字符是中文,不知道你所编码的方式,而你接过来的正好是去掉%后的字符,那要正确解码好像有点难度,不过也有个比较笨的方法

比如“我” UrlEnCode后是%e6%88%91,“们”UrlEncode后是%e4%bb%ac,如果我们把%去掉 ,就是“我”e68891,“们”e4bbac,观察有什么规律了吗,就是每两个字符前面都有一个%,那我们在解码的时候就在每两个字符前面就个%,然后再解码就OK了。

不过这是个最笨的方法,一定还有更好的方法(目前我还没想到,呵呵^_^),如果你有更好的方法,一定要通知我哦,^_^

在这提供一个文章参考,他的这种方法和我的不同
http://blog.chinaunix.net/u/5391/showart_286748.html
  回复  引用  查看    
#4楼 2008-11-19 11:32 | 余魁      
呵呵!谢谢回复了哈!~
我也是用的这个方法,但是有一点点问题就是
!@#$&*^这些好像都是不编码的!~
这样编码出来的位数可能就是个奇数
像这样的
%e6%88%!%91
按偶数位加%解码后就乱码
我现在是把!等都去掉了

但这不是长久之计啊

  回复  引用  查看    
#5楼 [楼主]2008-11-19 11:49 | 兴百放      
@余魁
特殊字符(不包括汉字),当时我也想到了,如果按照偶数前加%,肯定是有问题的
,不过对这个也有笨的方法,在笨一步(呵呵),就是你先写个特殊字符的数组,然后比对,成功先去掉特殊字符,然后记下改特殊字符的位置,剩下的全是a-z的字符了,然后加%,最后就是根据你记下的位置在填充上去,解码。不知道这个行不行,我没试过,呵呵,不过我建议就是你们最好把编码方式改变一下。
  回复  引用  查看    
#6楼 2008-11-19 11:53 | 余魁      
编码方式是不可能改了,因为是别人传过来的,没有这个面子叫别人改,
那现在 问题就是不知道那些能编码那些不能编码,还要正确解码,不能把特殊字符给去掉了,解码后还要正常读的!~

别人编码的程序用的java
我这边用net
要是用java就不会有这多问题了


  回复  引用  查看    
#7楼 [楼主]2008-11-19 13:24 | 兴百放      
@余魁
我的意思不是让你把那些特殊字符去掉,而是临时的去掉,去掉之后,不就没有特殊字符了,然后在按偶数加%,加完之后,在把刚才临时的特殊字符补上去,最后在解码

要是用java就不会有这多问题了?
要是用Java怎么解决你这个问题,我感觉这个不是语言的问题吧
  回复  引用  查看    
#8楼 2008-11-19 18:27 | 余魁      
呵呵,感觉有点难度
因为别人java代码写好了
我直接拿过来用不就好了

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-16 19:41 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:


相关搜索:
编码 解码 encode decode

相关链接: