2

我在让 HttpWebRequest 对 webrequest 中的参数使用 ISO-8859-1 编码时遇到问题,该问题与 POST 和 GET 有关。

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

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

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

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

4

2 回答 2

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())
{
    // ...
}
于 2010-11-11T15:10:56.930 回答
0

我宁愿尝试修复“管道的另一端”并使其接受 utf-8。如果您想“面向未来”,UTF-8 是必经之路

于 2010-11-13T10:12:21.530 回答