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

AHM*_*AHM 8 c# asp.net encoding http query-string

我试图从asp.net应用程序发送请求到这样的"http://mysite.dk/tværs?test=æ"的URL,并且我无法正确编码查询字符串.或者可能正确编码了查询字符串,我连接的服务只是无法正确理解.

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

Firefox: http://mysite.dk/tv%C3%A6rs?test=%E6
Ie8:     http://mysite.dk/tv%C3%A6rs?test=\xe6
Curl:    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编码查询字符串?

我正在创建这样的webrequest:

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

但问题似乎来自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"
Run Code Online (Sandbox Code Playgroud)

blo*_*art 5

看起来您在整个网址上应用了UrlEncode - 这是不正确的,路径和查询字符串的编码方式与您所见的不同.什么在进行URI的编码,WebRequest?

您可以手动建立使用各部分UriBuilder,或手动编码使用UrlPathEncode的路径,并以UrlEncode的查询字符串名称和值.

编辑:

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

<configuration>
  <uri>
      <iriParsing enabled="true" />
  </uri>
</configuration>
Run Code Online (Sandbox Code Playgroud)

那应该让国际角色独自留在路上.


AHM*_*AHM 0

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

\n\n

然而,现在浏览器中的行为很奇怪。将“http://mysite.dk/tv%C3%A6rs?test=%C3%A6”之类的网址复制粘贴到浏览器中,然后按回车键即可,它甚至会更正编码字符并将位置显示为“http: //mysite.dk/tv\xc3\xa6rs?test=\xc3\xa6"。如果然后重新加载页面(F5)它仍然有效。但是,如果我单击地址栏并再次按回车键,查询字符串将使用 latin-1 进行编码并失败。

\n\n

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

\n\n

所以,似乎没有什么好的解决办法。

\n\n

感谢所有提供帮助的人!

\n