URL编码问题 - HttpWebRequest不起作用,Firefox确实如此

时间:2009-11-15 20:28:20

标签: c# encoding web-services httpwebrequest

我正在尝试调用lims系统提供的休息网络服务(基本上是化学实验室数据库+接口)。它工作得很好,直到某些> ascii字符出现(特别是带有回旋,变音符号等的字符)

当调用传递值àèïõû的web服务时,我有以下参数:

&componentValue=àèïõû

HttpWebRequest,没有任何预先转义的OR与Uri.EscapeDataString()调用该值给出:

à èïõû

Firefox,与传递给HttpWebRequest的网站相同,提供了正确的值:

àèïõû

现在为了逃避: Uri.EscapeDataString()似乎将“àèïõû”转义为:

%C3%A0%C3%A8%C3%AF%C3%B5%C3%BB

Firefox将“àèïõû”转义为:

%E0%E8%EF%F5%FB

由于后者的作用我当然更喜欢用它作为我的逃生方法,但我真的不知道从哪里开始。我已经找到了大量关于处理响应数据编码的方法的信息,但没有找到请求。

2 个答案:

答案 0 :(得分:3)

来自MSDN

  

Uri.EscapeDataString方法

     

[...]所有Unicode字符在转义之前都会转换为UTF-8格式。

所以你看到的是àèïõû的UTF-8编码版本。

Uri.EscapeDataString不同,HttpUtility.UrlEncode允许您明确指定编码:

HttpUtility.UrlEncode("àèïõû", Encoding.GetEncoding("latin1"));

或者,您可以编写自己的版本;例如:

string.Concat(Encoding
   .GetEncoding("latin1")
   .GetBytes("àèïõû")
   .Select(x => "%" + x.ToString("x2"))
   .ToArray());

两者都会产生"%e0%e8%ef%f5%fb"

更好的解决方案可能是在Web服务中接受UTF-8编码的查询字符串。

答案 1 :(得分:0)

看来Uri.HexEscape()会做你想要的,但一次只能做一个角色。我将推出自己的转义函数,并希望您的代码页始终与Web服务使用的代码页相同,因为Web服务似乎不支持Unicode。