【興百放】Asp.Net 編碼和解碼
最近因為專案需要,做了一個投票的頁面(Html,比如A 頁面),要把它Post到一個Aspx頁面(比如B頁面),在這個Aspx頁面上,需要確認一下,在提交到資料庫,可是問題出來了,使用者在A頁面上點選Submit,Post到B頁面上的時候,在B頁面用Request.Form[“ID”],接收,但是顯示時,有時候是亂碼,有的時候卻是正常的,不知道為什麼,在網上查了一些資料,看了一些編碼的文章,感覺出現問題的原因是這樣的,A頁面雖然在開始有一句 ,但是使用者用的機器上的編碼可能是UTF或者GB的,在使用者Post的時候,是用使用者自己上的編碼格式編的碼(我的理解),從而在Request的時候就已經成亂碼了。一開始,我想兩種辦法,一種是用Url編碼,比如我們在A頁面上有一個Input : 音、視訊播放不連續" />音、視訊播放不連續,我們把它的Value用Url編碼,變成之類的" />音、視訊播放不連續,在B頁面用Request[“radiobuttonIsRightSee”],得到Value,然後再對這個Value解碼,可是出乎我的意料的是,用這個辦法得到的也是亂碼。碰壁後只有用第二種方案,就是用Unicode對其編碼,因為原先我沒有遇到編碼解碼問題,所以就在網上搜尋資源,但是與其相關的都沒有一個好的解決方案,只搜到一個漢字轉Unicode的工具,把其下載下來,先做了一個測試,對上文中的” 音、視訊播放不連續”,進行編碼,得到“\u97F3\u3001\u89C6\u9891\u64AD\u653E\u4E0D\u8FDE\u7EED”,然後再B頁面上在對這個Value解碼,果然,沒有成亂碼,看到這得你會不會想到,我怎麼對這一串進行解碼的,這個工具又沒有原始碼,其實這個工具是用.Net寫的,.Net寫的我們就有辦法看裡邊的原始碼了,只要他沒有對原始碼加密,用Reflector就行。解碼的原始碼如下:
寫到這裡問題基本上解決了,可是如果您的頁面上有n多的input ,你還用這個工具一個input,一個input,把其中的Value Copy –Convert-Parse,到你的頁面上嗎?其實我們可以寫一個正規表示式,用正規表示式來找出input中的Value,然後編碼之後,在把原先的Value替換成編碼後的Value,這樣的話,即省了功夫,又不會出錯(除非你的正則有問題),如果你不清楚怎麼寫的話,見一下程式碼:
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);
}
{
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
{
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [java IO流]之編碼和解碼Java
- Dubbo中編碼和解碼的解析
- Huffman對檔案編碼和解碼
- ==和is的區別 以及編碼和解碼
- python中字串的編碼和解碼Python字串
- 簡述小資料池,編碼和解碼
- js encode64編碼和解碼程式碼例項JS
- Java 8中的Base64編碼和解碼Java
- 結合例項學習|字元編碼和解碼字元
- PHP安全的URL字串base64編碼和解碼PHP字串
- js實現的字串簡單編碼和解碼程式碼例項JS字串
- android Java BASE64編碼和解碼一:基礎AndroidJava
- js自定義實現的簡單編碼和解碼程式碼例項JS
- .Net(ASP.net)--中文編碼問題ASP.NET
- seq2seq通俗理解----編碼器和解碼器(TensorFlow實現)
- netty系列之:自定義編碼和解碼器要注意的問題Netty
- java base64編碼 加密和解密(切記注意亂碼問題)Java加密解密
- url編碼和解碼分析URLEncoder.encode和URLDecoder.decode
- asp.net(C#) 編碼解碼(HtmlEncode與HtmlEncode)ASP.NETC#HTML
- 編碼最佳實踐——開放封閉原則
- Asp.net把UTF-8編碼轉換為GB2312編碼ASP.NET
- linux-原始碼的編譯安裝和解除安裝Linux原始碼編譯
- Mysql編碼, Mysql編碼流程, Mysql編碼順序, Mysql編碼原理, Mysql編碼修改依據MySql
- 軟體諮詢和編碼,興趣與發展的對話
- .net例項:Asp.net把UTF-8編碼轉換為GB2312編碼ASP.NET
- 【字元編碼】字元編碼 && Base64編碼演算法字元演算法
- IDEA如何設定編碼格式,字元編碼,全域性編碼和專案編碼格式Idea字元
- 禁止百度轉碼程式碼
- Asp.Net Core 使用Monaco Editor 實現程式碼編輯器ASP.NET
- 如何隱藏和解網頁原始碼網頁原始碼
- 其他感興趣的程式碼庫
- 【字元編碼】Java編碼格式探祕字元Java
- 熵編碼(四)-算術編碼(二)熵
- 影像壓縮編碼碼matlab實現——行程編碼Matlab行程
- 影像壓縮編碼碼matlab實現——DM編碼Matlab
- Javascript編碼解碼URLJavaScript
- Unicode編碼解碼Unicode
- js Jquery字元UrlEncode 編碼 C#(asp.net)解碼 Server HttpUtility 區別 cookies存中文JSjQuery字元C#ASP.NETServerHTTPCookie