我正在尝试调用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
由于后者的作用我当然更喜欢用它作为我的逃生方法,但我真的不知道从哪里开始。我已经找到了大量关于处理响应数据编码的方法的信息,但没有找到请求。
答案 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。