比较具有非英语字符的字符串?

4

我需要比较字符串以实现网站搜索机制。我使用C#。我尝试了两种方法:

consultants.Where(x => 
    x.Description.ToLower().Contains(vm.Description.ToLower()));

and

consultants.Where(x => 
    Regex.IsMatch(x.Description, vm.Description, RegexOptions.IgnoreCase));

两种都适用于所有英文字符。所以,如果我搜索“english”,那没问题。但是,一旦我尝试搜索包含非英文字符的字符串,它就无法工作。例如,如果我尝试搜索单词“språk”(瑞典语中的“language”),它将返回空值。

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


那里是否应该有与“språk”匹配的内容?什么? - R. Martinho Fernandes
2
请检查以下是否是原因:String.ToLower() 是与语言相关的 Regex 也是与文化有关的 - Sanjeevakumar Hiremath
7个回答

3
要正确比较非英文字符,您应该使用相应的区域规则。例如,您可以为瑞典语创建自己的不区分大小写的StringComparer,并在Contains方法中使用它。请参考StringComparer
var swedishComparer = StringComparer.Create(new CultureInfo("sv-Se"), true);

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

3

使用

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

或者

c.IndexOf(vm, StringComparison.OrdinalIgnoreCase)

Ordinal 意味着 Unicode,逐字节比较,与文化无关。


1

这里有一篇由Joel Spolsky撰写的字符集问题介绍,非常有趣。

简而言之,网页需要在页面开头告诉您它正在使用哪种字符集。C#使用Unicode(标准为UTF-16编码)来处理字符串,您可以在csharp in depth中找到相关解释。

希望这能对您有所帮助。


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

0
你在什么上进行搜索?是一个xml文件,db4o文件还是sql?数据库的字符编码很重要。你可以通过在xml设置中使用utf编码来处理它;db4o已经安全地作用于对象上,而对于sql,则需要设置字符编码。
如果你的数据库将值保存为char(50)或varchar(50),它可能会丢失不同的字符,如果想保留不同的字符,应该在你的sql数据库中使用nchar、nvarchar。不要忘记检查你的数据库字符编码,即使这并不是非常必要。

0
你正在处理哪种类型的列表?是普通列表还是ORM列表?如果是普通列表,使用string.Compare()

0

索引是搜索的重要组成部分。我认为最好使用像LuceneSolr这样的成熟且可靠的工具。

如果您仍然坚持使用正则表达式搜索非 ASCII 字符,那么您可能需要学习更多有关Unicode 类别,并在搜索文本中寻找单词之前使用它们去除任何重音符号(例如使用\p{P}\p{M})。

注意:为了更有效地进行分解和删除/搜索,您还可能需要使用FormC标志对字符串进行规范化


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接