2010-11-11 73 views
2

我有问题让HttpWebRequest在webrequest中对参数使用ISO-8859-1编码,问题与POST和GET都有关。获取HttpWebRequest使用ISO-8859-1编码进行urlencoding

简而言之,问题是任何包含非ascii字符(如Ö和æ)的请求参数都会转换为其UTF-8%表示,而不是其ISO-8859-1表示。

Ö被转换为%c3%96而不是%d6。

我目前的解决方案的想法是将请求字符串转换为ISO-8859-1字节数组,然后将字节数组转换回UTF-8,char为char,同时捕获大于127的字节并将其转换那些改为%十六进制值。

有没有更好的方法来解决这个问题?

+0

你目前使用什么方法对它们进行编码? – 2010-11-11 12:11:08

+0

目前没有,这是给我们的问题,因为.net似乎默认为UTF-8。 – Grubsnik 2010-11-11 12:50:36

回答

2

如下创建您自己的URL编码算法; WebRequest方法将使用您为自定义编码提供的URI。

string input = "http://www.example.com/q?Ö=æ"; 

StringBuilder sb = new StringBuilder(); 
foreach (byte by in Encoding.GetEncoding("ISO-8859-1").GetBytes(input)) 
{ 
    // NOTE: This is very simplistic; a robust solution would probably really need 
    // to handle all non-alphanum and non-reserved characters, as specified by 
    // http://www.ietf.org/rfc/rfc2396.txt 
    if (by <= 0x7F) 
     sb.Append((char) by); 
    else 
     sb.Append(string.Format("%{0:X2}", by)); 
} 

Uri uri = new Uri(sb.ToString()); 
// uri.AbsoluteUri == "http://www.example.com/q?%D6=%E6" 

WebRequest request = WebRequest.Create(uri); 
using (request.GetResponse()) 
{ 
    // ... 
} 
+1

这是我希望避免的那种解决方案,但从来就不是那种非常优雅的解决方案。 – Grubsnik 2010-11-12 09:12:15

0

我宁愿尝试修复“管道的另一端”,并使其接受utf-8。 如果你想成为“未来的证明”,UTF-8就是要走的路。

+1

我们无法控制我们正在访问的网站。所以网站可怕的过时这个事实,我们不能解决。 – Grubsnik 2010-11-15 08:21:42