检查大写/小写查询字符串的最佳方法
Posted
技术标签:
【中文标题】检查大写/小写查询字符串的最佳方法【英文标题】:Best way to check for upper/lower case query strings 【发布时间】:2012-05-03 16:54:21 【问题描述】:我有一个问题,我需要从 url 中提取查询字符串参数。该参数可以是"Territory"
或"territory"
或该单词的其他大写/小写变体。虽然以下适用于前两种情况,但我想知道是否有更好的方法?
IDictionary<string, string> queryString = htmlPage.Document.QueryString;
if (queryString.ContainsKey("territory"))
ish.SetDefaultRegion(int.Parse(queryString["territory"]));
// do something (the same something as below)
else if (queryString.ContainsKey("Territory"))
ish.SetDefaultRegion(int.Parse(queryString["Territory"]));
// do something (the same something as above)
我宁愿将查询字符串插入字典中忽略大小写(即,如果用户不小心输入了"TERRITORY"
,此代码将失败,那么我如何才能测试该单词是否存在而不管大小写?
【问题讨论】:
这可以帮助你。从 queryString 对象中获取密钥。将其转换为小写,然后与“领土”进行比较。这样你就不用担心外壳了。 @Krishna:如果您不知道它的大小写(除了遍历每个键),如何从 queryString 对象中准确获取键? @Cameron - 感谢您的澄清。这正是我的问题!Request.QueryString["territory"]
已经不区分大小写。在 URL 中是否为“Territory”、“territory”、“TeRrItOrY”等都没有关系。
@Doug 这很可能是真的,但 ContainsKey 查找仍然无法匹配“Territory”和“TeRrItOrY” - 因此,根据答案,在从 QueryString 创建字典时,一个案例 -需要不敏感的密钥比较器。
【参考方案1】:
使用带有不区分大小写的键比较器的字典:
var queryParams = new Dictionary<string, string>(
HtmlPage.Document.QueryString,
StringComparer.InvariantCultureIgnoreCase
);
if (queryParams.ContainsKey("territory"))
// Covers "territory", "Territory", "teRRitory", etc.
【讨论】:
警告:我相信 InvariantCultureIgnoreCase 是一个危险的选择。似乎 OrdinalIgnoreCase 是安全的选择。据我了解,InvariantCulture 将重音字母视为与非重音字母相同。所以我解释这意味着“resumeID”=“resuméID”。但我知道 OrdinalIgnoreCase 将“resumeID”和“resuméID”视为不同的字符串。免责声明:我没有对此进行测试,目前也没有时间这样做。网上的很多信息都是不好的建议,或者完全是错误的,所以我只是发布这个“小心这个”,我不确定。 :P @Shawn:你知道,OrdinalIgnoreCase
在这里可能是一个更好的默认值。但是,InvariantCultureIgnoreCase
肯定不认为resumeID
和resuméID
相等(try it!)。我相信它只是在比较过程中进行了一种 Unicode 规范化(因此,e 后跟一个组合的重音符号将等于 e-with-acute-accent 字符),而 OrdinalIgnoreCase
按代码点检查代码点(尽管我可能是错的也是,呵呵)。还有更多信息here。【参考方案2】:
如果您的 QueryString 对象不是字典对象,而是诸如 NameValueCollection 之类的东西...
IDictionary<string, string> queryString = QueryString.AllKeys.ToDictionary(k => k.ToLowerInvariant(), k => QueryString[k]);
【讨论】:
但是当查询字符串包含仅大小写不同的“重复”键时,这个代码会中断(错误)吗?那么当查询字符串为 'abc=1&ABC=2' 时,这段代码会做什么呢?【参考方案3】:你好,它也可以是TeRriTory,在查询字符串中做一个.Tolower()
【讨论】:
Querystring 是一个字典,你不能对它做tolower以上是关于检查大写/小写查询字符串的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章