【興百放】Asp.Net 編碼和解碼

iDotNetSpace發表於2008-05-20
  最近因為專案需要,做了一個投票的頁面(Html,比如A 頁面),要把它Post到一個Aspx頁面(比如B頁面),在這個Aspx頁面上,需要確認一下,在提交到資料庫,可是問題出來了,使用者在A頁面上點選SubmitPostB頁面上的時候,在B頁面用Request.Form[ID],接收,但是顯示時,有時候是亂碼,有的時候卻是正常的,不知道為什麼,在網上查了一些資料,看了一些編碼的文章,感覺出現問題的原因是這樣的,A頁面雖然在開始有一句,但是使用者用的機器上的編碼可能是UTF或者GB的,在使用者Post的時候,是用使用者自己上的編碼格式編的碼(我的理解),從而在Request的時候就已經成亂碼了。一開始,我想兩種辦法,一種是用Url編碼,比如我們在A頁面上有一個Input : 音、視訊播放不連續" />音、視訊播放不連續,我們把它的ValueUrl編碼,變成之類的" />音、視訊播放不連續,在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 = @"(]*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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-281049/,如需轉載,請註明出處,否則將追究法律責任。

相關文章