繁体   English   中英

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

[英]Compare strings with non-English characters?

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

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

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

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

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

采用

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

要么

c.IndexOf(vm, StringComparison.OrdinalIgnoreCase)

Ordinal表示Unicode,逐字节,与区域性无关的比较。

这是Joel Spolsky 对字符集问题介绍 一个非常有趣的阅读。

简而言之,网页需要在页面开始时告诉您正在使用什么字符集。 C#正在对字符串使用unicode(以UTF-16编码为标准格式),这说明了在csharp中可以找到的含义

希望这会帮助你。

您搜索什么? 在xml文件上,在db4o文件上,在sql上? 数据库的字符编码很重要。 您可以在xml中设置utf编码来处理它; 和db4o,它已经可以在对象上安全地工作了,在sql端,您必须设置charachter编码。

如果您的数据库将值保留为char(50)或varchar(50),则它可能会丢失不同的字符,要保留不同的字符,则应在sql数据库中使用nchar,nvarchar。 不要忘记检查您的数据库字符编码,即使它没有太多必要

您正在处理哪种列表? 普通列表还是ORM? 如果它是纯列表,请使用string.Compare()

索引是搜索的重要组成部分。 我认为最好使用诸如LuceneSolr之类的现成固体来为您服务。

如果您仍然坚持使用非ASCII字符搜索正则表达式,则可能应该了解unicode类别的更多信息,然后使用它们来去除任何重音符号(例如,使用\\p{P}\\p{M} )在文本中搜索该单词。

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

感谢所有提供建议的人,但不幸的是,它们似乎无关紧要。 事实证明,包含()对于非英语字符完全没有问题。 问题是有问题的数据库字段具有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()代码可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM