如何在URI中将URI查询字符串正确解析为名称 - 值集合?

时间:2012-04-19 15:57:24

标签: c#

我正在使用.NET 4.5,我正在尝试将URI查询字符串解析为NameValueCollection。正确的方法似乎是使用HttpUtility.ParseQueryString(string query)来获取从Uri.Query获得的字符串并返回NameValueCollectionUri.Query返回根据RFC 2396转义的字符串,HttpUtility.ParseQueryString(string query)需要一个URL编码的字符串。假设RFC 2396和URL编码是相同的,这应该可以正常工作。

但是,ParseQueryString the documentation声称它“使用UTF8格式来解析查询字符串”。还有一个重载方法,它采用System.Text.Encoding,然后使用它而不是UTF8。

我的问题是:使用UTF8作为编码是什么意思?输入是string,根据定义(在C#中)是UTF-16。怎么解释为UTF-8?在这种情况下,使用UTF8和UTF16作为编码有什么区别?我担心的是,由于我接受任意用户输入,如果我编码(即用户可能会通过某些脚本漏洞利用),可能存在一些安全风险。

此主题有一个上一个问题(How to parse a query string into a NameValueCollection in .NET),但它没有专门解决编码问题。

1 个答案:

答案 0 :(得分:7)

解析编码的值时,会将这些值视为UTF-8。以角色¢为例。 UTF-8编码是C2 A2。因此,如果它在查询字符串中,则将编码为%C2%A2。

现在,当ParseQueryString正在解码时,它需要知道要使用的编码。默认值为UTF-8,表示该字符将被正确解码。但也许用户正在使用Microsoft's Cyrillic代码页(Windows-1251),其中C2和A2是两个不同的字符。在这种情况下,将其解释为UTF-8将是一个错误。

如果这是用户界面应用程序(即用户直接输入数据),那么您可能希望使用为当前UI文化定义的任何编码。如果您从网页获取此信息,那么您将需要使用页面使用的任何编码。如果您正在编写Web服务,那么您可以告诉用户他们的输入必须是UTF-8编码。