我需要比较网站上搜索机制的字符串。我用C#。我试过两种方法:
consultants.Where(x =>
x.Description.ToLower().Contains(vm.Description.ToLower()));
和
consultants.Where(x =>
Regex.IsMatch(x.Description, vm.Description, RegexOptions.IgnoreCase));
两者都适用于所有英文字符。因此,如果我搜索“英语”,那就没问题了。但是一旦我尝试搜索包含非英文字符的字符串,它就不起作用。例如,如果我尝试搜索单词“språk”(瑞典语中的“language”),则不返回任何内容。
为什么会这样,我该如何解决?
答案 0 :(得分:2)
为了正确比较非英文字符,您应该使用适当的文化规则。例如。您可以为瑞典语创建自己的不区分大小写的StringComparer
,并在Contains
方法中使用它:
var swedishComparer = StringComparer.Create(new CultureInfo("sv-Se"), true);
consultants = consultants
.Where(x =>
x.Description.Contains(vm.Description, swedishComparer)
).ToList();
答案 1 :(得分:2)
使用
String.Equals(c, vm, StringComparison.OrdinalIgnoreCase)
或
c.IndexOf(vm, StringComparison.OrdinalIgnoreCase)
Ordinal
表示Unicode,每字节字节,与文化无关的比较。
答案 2 :(得分:1)
这是Joel Spolsky的introduction to the character set problem。一个非常有趣的读物。
简而言之,网页需要告诉您在页面的最开始使用的字符集。 C#使用unicode(以UTF-16编码作为标准)作为字符串,解释这意味着你在csharp in depth
中可以找到什么希望这会对你有所帮助。
答案 3 :(得分:0)
你在搜索什么?在xml文件上,在db4o文件上,在sql上?数据库的字符编码很重要。你可以在xml设置它的utf编码处理它;和db4o它已经安全地工作在对象上,在sql端你必须设置charachter编码。
如果您将数据库保存为char(50)或varchar(50),它可能会错过不同的字符,要保存不同的字符,您应该在sql-database中使用nchar,nvarchar。不要忘记检查数据库字符编码,即使它不是很必要
答案 4 :(得分:0)
你在做什么样的清单?简单列表或ORM?如果是普通列表,请使用string.Compare()
。
答案 5 :(得分:0)
索引是搜索的重要组成部分。我认为通过使用现成且可靠的内容(例如Lucene或Solr),您将获得最佳服务。
如果你仍然坚持使用非ascii字符的正则表达式进行搜索,你应该在unicode categories上了解更多信息,然后使用它们去除任何重音符号(例如,使用\p{P}
或{ {1}})在文本中搜索该单词之前。
答案 6 :(得分:0)
感谢所有提出建议的人,但遗憾的是他们似乎无关紧要。事实证明,Contains()对非英语字符没有任何问题。问题是有问题的数据库字段有html编码文本,所以我需要使用HtmlDecode来比较控制器中的字符串:
if (vm.Description != "")
{
//HttpUtility.HtmlDecode needed because text in Description field is HtmlEncoded!
consultants = consultants.Where(x => HttpUtility.HtmlDecode(x.Description).ContainsCaseInsensitive(vm.Description)).ToList();
}
我发现这是因为在搜索具有非英文字符的其他字段时,Contains()代码工作正常。