将字符串与非英文字符进行比较?
我需要为网站上的搜索机制比较字符串。我使用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”),它将不会返回任何内容。
这是为什么,我该如何解决它?
你在搜索什么?在一个XML文件上,在一个db4o文件上,在SQL?数据库的字符编码很重要。你可以在xml中使用utf-coding来处理它;和db4o它已经是安全的对象工作,在SQL端你必须设置charachter编码。
如果你的数据库的值是char(50)或varchar(50),它可能会错过不同的字符,为了容纳不同的字符,你应该在你的sql数据库中使用nchar,nvarchar。不要忘记检查你的数据库字符编码,即使它不是必要的
你正在处理什么样的列表?一个普通的列表或一个ORM?如果它是一个普通列表,则使用string.Compare()
。
为了正确比较非英文字符,您应该为此使用适当的文化规则。例如。你可以创建自己的不区分大小写StringComparer
瑞典和Contains
方法使用它:
var swedishComparer = StringComparer.Create(new CultureInfo("sv-Se"), true);
consultants = consultants
.Where(x =>
x.Description.Contains(vm.Description, swedishComparer)
).ToList();
索引是搜索的重要组成部分。我认为你最好通过使用一些准备好和坚实的东西来服务,比如Lucene或Solr。
如果你仍然坚持对非ASCII字符的搜索使用正则表达式,你应该寻找在这个词之前了解更多关于unicode categories,然后用它们来剥夺任何重音符号(例如,与\p{P}
或\p{M}
条)文本。
这里是一个introduction to the character set problem由Joel Spolsky的。一个非常有趣的阅读。
总之,网页需要告诉你它在页面的最开始使用的字符集。 C#使用unicode(以UTF-16编码作为标准)字符串,解释这意味着您可以在这里找到csharp in depth
希望这会对您有所帮助。
使用
String.Equals(c, vm, StringComparison.OrdinalIgnoreCase)
或
c.IndexOf(vm, StringComparison.OrdinalIgnoreCase)
Ordinal
装置的Unicode,字节每字节,非培养比较。
感谢所有提供建议的人,但不幸的是他们似乎无关紧要。事实证明,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();
}
我发现了这一点,因为载有()搜索另一场时,代码工作正常非英文字符。
有什么应该匹配“språk”在那里?什么? – 2011-04-07 08:49:03
检查以下是否是原因。 [String.ToLower()是语言相关](http://msdn.microsoft.com/en-us/library/aa904312(v = VS.71).aspx)[正则表达式也是文化敏感](http:// msdn.microsoft.com/en-us/library/hs600312.aspx) – 2011-04-07 08:52:17