日期:2014-05-19  浏览次数:21180 次

有关字符编码的问题,如果将"%C4%E3%BA%C3%B0%A1%A3%A1"之类的字符转换为正常的字符?
我用WebRequest类向一个http服务器获取信息,服务器返回给我的是一些类似:

%C4%E3%BA%C3%B0%A1%A3%A1%2B_-)(*%26%5E

这样的信息,我知道这个字符是经过unicode编码的,例如最后的一个%5E其实就代表“^”字符。

用UnicodeEncoding.GetString()方法好像不行。。。。

------解决方案--------------------
接受aluzi的批评 重新写了一个解析utf8的函数

private void button2_Click(object sender, EventArgs e)
{
string a = "你好啊! ";
a = ToUtf8(a);
a = FromUtf8(a);
textBox1.Text = a;
}

//用于将字符串转换成UTF-8编码
private static string ToUtf8(string str)
{
if (str == null)
{
return string.Empty;
}
else
{
char[] hexDigits = { '0 ', '1 ', '2 ', '3 ', '4 ',
'5 ', '6 ', '7 ', '8 ', '9 ',
'A ', 'B ', 'C ', 'D ', 'E ', 'F '};

Encoding utf8 = Encoding.UTF8;
StringBuilder result = new StringBuilder();

for (int i = 0; i < str.Length; i++)
{
string sub = str.Substring(i, 1);
byte[] bytes = utf8.GetBytes(sub);

for (int j = 0; j < bytes.Length; j++)
{
result.Append( "% " + hexDigits[bytes[j] > > 4] + hexDigits[bytes[j] & 0XF]);
}
}

return result.ToString();
}
}

//将UTF-8编码转换成字符串
public string FromUtf8(string str)
{
char[] hexDigits = { '0 ', '1 ', '2 ', '3 ', '4 ',
'5 ', '6 ', '7 ', '8 ', '9 ',
'A ', 'B ', 'C ', 'D ', 'E ', 'F '};
List <byte> byteList = new List <byte> (str.Length / 3);

if (str != null)
{
List <string> strList = new List <string> ();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.Length; ++i)
{
if (str[i] == '% ')
{
strList.Add(str.Substring(i, 3));
}
}

foreach (string tempStr in strList)
{
int num = 0;
int temp = 0;
for (int j = 0; j < hexDigits.Length; ++j)
{
if (hexDigits[j].Equals(tempStr[1]))
{
temp = j ;
num = temp < < 4;
}
}

for (int j = 0; j < hexDigits.Length; ++j)
{
if (hexDigits[j].Equals(tempStr[2]))
{
num += j;
}
}