查询字符串的正确编码是什么

本文关键字:编码 是什么 字符串 查询 | 更新日期: 2023-09-27 17:56:20

我正在尝试从 asp.net 应用程序向类似"http://mysite.dk/tv ærs?test=æ"的网址发送请求,并且无法正确编码查询字符串。或者,查询字符串的编码正确,我连接到的服务无法正确理解它。

我尝试使用不同的浏览器发送请求并记录他们如何使用 Wireshark 对请求进行编码,我得到以下结果:

火狐: http://mysite.dk/tv%C3%A6rs?test=%E6IE8: http://mysite.dk/tv%C3%A6rs?test=''xe6卷曲: http://mysite.dk/tv''xe6rs?test=''xe6

Firefox,IE和Curl都会从该服务接收正确的结果。请注意,它们在查询字符串中对丹麦语特殊字符"æ"进行编码的方式不同。

当我使用 HttpWebRequest 从我的 asp.net 应用程序发送请求时,URL 按以下方式编码:

http://mysite.dk/tv%C3%A6rs?test=%C3%A6

它对查询字符串的编码方式与对 url 的路径部分进行编码的方式相同。远程服务不理解此编码,因此我没有得到正确答案。

作为记录,"æ"(U+00E6)在ISO-LATIN-1中为%E6,在UTF-8中为%C3%A6。

我可以更改远程服务以接受 UTF-8 编码的查询字符串,但随后该服务将在浏览器中停止工作,我对此并不真正感兴趣。有没有办法向 .NET 指定它不应该使用 UTF-8 对查询字符串进行编码?

我正在像这样创建网络请求:

var req = WebRequest.Create("http://mysite.dk/tværs?test=æ") as HttpWebRequest;

但问题似乎源于 System.Uri,它显然在 WebRequest.Create 中使用:

var uri = new Uri("http://mysite.dk/tværs?test=æ");
// now uri.AbsolutePath == "http://mysite.dk/tv%C3%A6rs?test=%C3%A6"

查询字符串的正确编码是什么

看起来您正在对整个URL应用UrlEncode-这是不正确的,路径和查询字符串的编码方式与您所看到的不同。什么是URI,WebRequest的编码?

您可以使用 UriBuilder 手动构建各个部分,也可以使用 UrlPathEncode 对路径进行手动编码,对查询字符串名称和值使用 UrlEncode 进行编码。

编辑:

如果问题出在路径上,而不是查询字符串,您可以尝试通过 web.config 打开 IRI 支持

<configuration>
  <uri>
      <iriParsing enabled="true" />
  </uri>
</configuration>

这样一来,国际人物就应该独自走上正轨。

你试过 UrlEncode 吗?

http://msdn.microsoft.com/en-us/library/zttxte6w.aspx

我最终更改了我的远程 Web 服务,以期望查询字符串采用 UTF-8 编码。它解决了我的直接问题,PHP和.NET框架无法正确调用Web服务。

但是,这种行为现在在浏览器中很奇怪。将像"http://mysite.dk/tv%C3%A6rs?test=%C3%A6"这样的网址复制到浏览器中,然后按回车键就可以了,它甚至可以更正编码的字符并将位置显示为"http://mysite.dk/tv ærs?test=æ"。如果然后重新加载页面 (F5),它仍然有效。但是,如果我单击地址栏并再次按回车键,查询字符串将使用拉丁语 1 编码并失败。

对于任何感兴趣的人,这里有一个关于这个问题的旧Firefox错误报告:https://bugzilla.mozilla.org/show_bug.cgi?id=284474(感谢@dtb)

因此,似乎没有好的解决方案。

感谢所有帮助过的人!