【问题标题】:How to compare strings with case insensitive and accent insensitive如何比较不区分大小写和不区分重音的字符串
【发布时间】:2015-03-10 07:24:33
【问题描述】:

如何比较不区分大小写和不区分重音的字符串

好吧,这在 SQL Server 上很容易完成

但是我想在 C# .NET 4.5.1 上做同样的事情。

我怎样才能用最合适的方式做到这一点?

我的意思是这 3 个字符串在比较时应该返回相等

http://www.buroteknik.com/metylan-c387c4b0ft-tarafli-bant-12cm-x25mt_154202.html
http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLI-BANT-12cm-x25mt_154202.html
http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLı-BANT-12cm-x25mt_154202.html

我需要一个方法来说明下面这两个是相同的 SQL 服务器说它们是相等的。

 tarafli 
 TARAFLİ 

【问题讨论】:

标签: c# .net string-comparison case-insensitive accent-insensitive


【解决方案1】:

要忽略大小写和重音,您可以将string.Compare()IgnoreNonSpaceIgnoreCase 选项一起使用,如下所示:

string s1 = "http://www.buroteknik.com/metylan-c387c4b0ft-tarafli-bant-12cm-x25mt_154202.html";
string s2 = "http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLI-BANT-12cm-x25mt_154202.html";
string s3 = "http://www.buroteknik.com/METYLAN-C387C4B0FT-TARAFLı-BANT-12cm-x25mt_154202.html";

Console.WriteLine(string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase));
Console.WriteLine(string.Compare(s2, s3, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase));

响应您的以下 cmets,这也适用于 tarafliTARAFLİ

以下代码打印 0,表示字符串相等

string s1 = "tarafli";
string s2 = "TARAFLİ";
Console.WriteLine(string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase));

这里使用的是土耳其文化(我猜测正确的文化是什么)。 这也会打印 0:

string s1 = "tarafli";
string s2 = "TARAFLİ";

var trlocale = CultureInfo.GetCultureInfo("tr-TR");
Console.WriteLine(string.Compare(s1, s2, trlocale, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase));

【讨论】:

  • 好的,这个方法对这两个字符串失败了:tarafli - TARAFLİ 但是 SQL 服务器说应该是相等的
  • @MonsterMMORPG 这些字符串来自什么语言环境?
  • @MonsterMMORPG 当我尝试使用这些字符串时效果很好。我会把它放在我的答案中。
  • 我也试过了,它对我有用(我使用了不变的文化)。
【解决方案2】:

您可以将string.Compare 与采用正确CultureInfoCompareOptions 的重载一起使用:

string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace |
                                                   CompareOptions.IgnoreCase);

编辑:

关于CultureInfo的问题,来自MSDN

比较使用culture参数来获得culture-specific 信息,例如大小写规则和字母顺序 个别字符。例如,特定的文化可以指定 将某些字符组合视为单个字符 字符,大写和小写字符在一个 特定的方式,或者字符的排序顺序取决于 前面或后面的字符。

【讨论】:

  • 因为您希望与用户在其机器上运行的文化兼容。查看我的编辑。
  • 再次感谢您的回答,当我设置不变的文化和不变的大小写时,我们可以说 MS SQL 服务器也使用该信息吗?
  • MSSQL 跟什么有什么关系?
  • 无论哪台机器工作不变的文化和不变的情况,所以我想知道:D 啊我虽然设置了拉丁语:D 我现在看到了
  • 好的,这个方法对这两个字符串失败了:tarafli - TARAFLİ 但是 SQL 服务器说应该是相等的
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2012-02-29
相关资源
最近更新 更多