9

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

好的,这在 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İ 
4

2 回答 2

15

要忽略大小写和重音,您可以string.Compare()同时使用IgnoreNonSpaceANDIgnoreCase选项,如下所示:

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));

为了回应您在下面的评论,这tarafli也适用TARAFLİ

以下代码打印 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));
于 2015-01-12T13:57:08.147 回答
4

您可以使用带有正确andstring.Compare的重载:CultureInfoCompareOptions

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

编辑:

至于你的问题CultureInfo,来自MSDN

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

于 2015-01-12T13:56:10.130 回答