[英]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,逐字节,与区域性无关的比较。
您搜索什么? 在xml文件上,在db4o文件上,在sql上? 数据库的字符编码很重要。 您可以在xml中设置utf编码来处理它; 和db4o,它已经可以在对象上安全地工作了,在sql端,您必须设置charachter编码。
如果您的数据库将值保留为char(50)或varchar(50),则它可能会丢失不同的字符,要保留不同的字符,则应在sql数据库中使用nchar,nvarchar。 不要忘记检查您的数据库字符编码,即使它没有太多必要
您正在处理哪种列表? 普通列表还是ORM? 如果它是纯列表,请使用string.Compare()
。
索引是搜索的重要组成部分。 我认为最好使用诸如Lucene或Solr之类的现成固体来为您服务。
如果您仍然坚持使用非ASCII字符搜索正则表达式,则可能应该了解unicode类别的更多信息,然后使用它们来去除任何重音符号(例如,使用\\p{P}
或\\p{M}
)在文本中搜索该单词。
感谢所有提供建议的人,但不幸的是,它们似乎无关紧要。 事实证明,包含()对于非英语字符完全没有问题。 问题是有问题的数据库字段具有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.