我正在使用.NET 4.5,我正在尝试将URI查询字符串解析为NameValueCollection.正确的方法似乎是使用HttpUtility.ParseQueryString(string query)从中获取的字符串Uri.Query并返回一个NameValueCollection.Uri.Query返回根据RFC 2396转义的字符串,并HttpUtility.ParseQueryString(string query)期望一个URL编码的字符串.假设RFC 2396和URL编码是相同的,这应该工作正常.
然而,文档的ParseQueryString,它声称"使用UTF-8格式来解析查询字符串".还有一个重载方法,它采用a System.Text.Encoding然后使用它而不是UTF8.
我的问题是:使用UTF8作为编码是什么意思?输入是a string,根据定义(在C#中)是UTF-16.怎么解释为UTF-8?在这种情况下,使用UTF8和UTF16作为编码有什么区别?我担心的是,由于我接受任意用户输入,如果我破坏编码可能会有一些安全风险(即用户可能会漏掉一些脚本漏洞).
关于此主题有一个上一个问题(如何将查询字符串解析为.NET中的NameValueCollection),但它没有专门解决编码问题.
解析编码值时,它会将这些值视为UTF-8.以角色¢为例.UTF-8编码是C2 A2.因此,如果它在查询字符串中,它将被编码为%C2%A2.
现在,在ParseQueryString解码时,它需要知道要使用的编码.默认值为UTF-8,表示该字符将被正确解码.但也许用户使用的是微软的西里尔语代码页(Windows-1251),其中C2和A2是两个不同的字符.在这种情况下,将其解释为UTF-8将是一个错误.
如果这是一个用户界面应用程序(即用户直接输入数据),那么您可能希望使用为当前UI文化定义的任何编码.如果您从网页获取此信息,那么您将需要使用页面使用的任何编码.如果您正在编写Web服务,那么您可以告诉用户他们的输入必须是UTF-8编码的.
| 归档时间: |
|
| 查看次数: |
2081 次 |
| 最近记录: |