比较字符串与非英文字符?

时间:2011-04-07 08:43:12

标签: c# .net linq string-comparison

我需要比较网站上搜索机制的字符串。我用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”),则不返回任何内容。

为什么会这样,我该如何解决?

7 个答案:

答案 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)

索引是搜索的重要组成部分。我认为通过使用现成且可靠的内容(例如LuceneSolr),您将获得最佳服务。

如果你仍然坚持使用非ascii字符的正则表达式进行搜索,你应该在unicode categories上了解更多信息,然后使用它们去除任何重音符号(例如,使用\p{P}或{ {1}})在文本中搜索该单词之前。

注意:您可能还需要使用normalize标记FormC字符串才能更有效地分解和删除/搜索

答案 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()代码工作正常。