URL编码问题 - HttpWebRequest无法工作,Firefox可以

3

我正在尝试调用由lims系统提供的rest webservice(基本上是化学实验室数据库+接口)。一切都很顺利,直到出现一些> ascii字符(特别是带有抑扬符号、umlauts等字符)。

当传递值àèïõû调用webservice时,我得到了以下参数:

&componentValue=àèïõû

使用HttpWebRequest发送请求时,如果没有进行任何预转义操作,或者对值调用了Uri.EscapeDataString()方法,则会得到以下结果:

à èïõû

使用相同的网站,Firefox 浏览器可以正确显示值,而使用 HttpWebRequest 则无法正确显示:

àèïõû

现在来讲转义本身:
Uri.EscapeDataString()似乎会将"àèïõû" 转义为:
%C3%A0%C3%A8%C3%AF%C3%B5%C3%BB

Firefox将 "àèïõû" 转义为:

%E0%E8%EF%F5%FB

作为后者的工作,我当然更喜欢使用它作为我的转义方法,但是我真的不知道从哪里开始。我找到了很多关于处理响应数据上的编码不同方法的信息,但并没有关于请求的。

2个回答

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"的结果。

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


感谢您的快速回答和详细信息 - 我无法控制网络服务,但已将信息发送给供应商。 - Chris B

0

看起来 Uri.HexEscape() 可以实现你想要的功能,但是一次只能转义一个字符。我建议你自己编写转义函数,并且希望你的代码页始终与 Web 服务使用的代码页相同,因为似乎该 Web 服务不支持 Unicode。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接