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

本文关键字:集合 中将 URI 字符串 查询 | 更新日期: 2023-09-27 18:31:45

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

但是,ParseQueryString的文档声称它"使用 UTF8 格式来解析查询字符串"。还有一个重载方法,它采用System.Text.Encoding,然后使用它代替 UTF8。

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

关于

此主题有一个上一个问题(如何在 .NET 中将查询字符串解析为 NameValueCollection),但它没有专门解决编码问题。

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

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

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

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