2011-04-07 275 views
2

我需要为网站上的搜索机制比较字符串。我使用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

有什么应该匹配“språk”在那里?什么? – 2011-04-07 08:49:03

+2

检查以下是否是原因。 [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

回答

0

你在搜索什么?在一个XML文件上,在一个db4o文件上,在SQL?数据库的字符编码很重要。你可以在xml中使用utf-coding来处理它;和db4o它已经是安全的对象工作,在SQL端你必须设置charachter编码。

如果你的数据库的值是char(50)或varchar(50),它可能会错过不同的字符,为了容纳不同的字符,你应该在你的sql数据库中使用nchar,nvarchar。不要忘记检查你的数据库字符编码,即使它不是必要的

0

你正在处理什么样的列表?一个普通的列表或一个ORM?如果它是一个普通列表,则使用string.Compare()

2

为了正确比较非英文字符,您应该为此使用适当的文化规则。例如。你可以创建自己的不区分大小写StringComparer瑞典和Contains方法使用它:

var swedishComparer = StringComparer.Create(new CultureInfo("sv-Se"), true); 

consultants = consultants 
    .Where(x => 
     x.Description.Contains(vm.Description, swedishComparer) 
    ).ToList(); 
0

索引是搜索的重要组成部分。我认为你最好通过使用一些准备好和坚实的东西来服务,比如LuceneSolr

如果你仍然坚持对非ASCII字符的搜索使用正则表达式,你应该寻找在这个词之前了解更多关于unicode categories,然后用它们来剥夺任何重音符号(例如,与\p{P}\p{M}条)文本。

注意:您也可能需要normalize使用FormC标志的字符串,以分解和钢带/更有效地搜索

1

这里是一个introduction to the character set problem由Joel Spolsky的。一个非常有趣的阅读。

总之,网页需要告诉你它在页面的最开始使用的字符集。 C#使用unicode(以UTF-16编码作为标准)字符串,解释这意味着您可以在这里找到csharp in depth

希望这会对您有所帮助。

2

使用

String.Equals(c, vm, StringComparison.OrdinalIgnoreCase) 

c.IndexOf(vm, StringComparison.OrdinalIgnoreCase) 

Ordinal装置的Unicode,字节每字节,非培养比较。

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(); 
     } 

我发现了这一点,因为载有()搜索另一场时,代码工作正常非英文字符。

相关问题