代码之家  ›  专栏  ›  技术社区  ›  Grubsnik

使HttpWebRequest对urlencoding使用ISO-8859-1编码

  •  2
  • Grubsnik  · 技术社区  · 15 年前

    我在让HttpWebRequest对webrequest中的参数使用ISO-8859-1编码时遇到问题,这个问题与POSTs和get都有关。

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

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

    我目前的解决方案是将请求字符串转换为ISO-8859-1字节数组,然后将byte array转换回UTF-8,char-for-char,同时捕获任何字节>127并将其转换为%hex值。

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Bradley Grainger    15 年前

    创建自己的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())
    {
        // ...
    }
    
        2
  •  0
  •   Mihai Nita    15 年前

    我宁愿试着修复“管道的另一边”,让它接受utf-8。 如果你想“经得起未来考验”,UTF-8是一条必经之路

    推荐文章