我正在研究string.Normalize()
方法,如果它们使用不同的unicode,我认为该方法可用于比较字符串相等性。
这是我到目前为止所做的。 string.Equals()
不是我应该在这里使用的东西吗?
string stra = "á";
string straNorm = stra.Normalize();
string strFormC = stra.Normalize(NormalizationForm.FormC);
string strFormD = stra.Normalize(NormalizationForm.FormD);
string strFormKC = stra.Normalize(NormalizationForm.FormKC);
string strFormKD = stra.Normalize(NormalizationForm.FormKD);
Console.WriteLine("norm {0}",straNorm);
Console.WriteLine("C {0}", strFormC);
Console.WriteLine("D {0}", strFormD);
Console.WriteLine("KC {0}", strFormKC);
Console.WriteLine("KD {0}", strFormKD);
Console.WriteLine("a".Equals(stra)); //false
Console.WriteLine("a".Equals(straNorm)); //false
Console.WriteLine("a".Equals(stra.Normalize())); //false
Console.WriteLine("a".Equals(strFormC)); //false
Console.WriteLine("a".Equals(strFormKC)); //false
Console.WriteLine("a".Equals(strFormKD)); //false
答案 0 :(得分:12)
您可以使用string.Compare()
设置CultureInfo.InvariantCulture
和CompareOptions.IgnoreNonSpace
,如下所示,我创建了一个名为CompareStrings(string str1, string str2)
的方法,它将返回一个boolean
< / p>
public bool CompareStrings(string str1, string str2)
{
return string.Compare(str1, str2, CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace) == 0;
}
调用比较字符串的方法:
Console.WriteLine(CompareStrings("a", "á"));
Console.WriteLine(CompareStrings("a", "a"));
Console.WriteLine(CompareStrings("a", "b"));
结果:
True
True
False
CompareOptions.IgnoreNonSpace
定义:“表明字符串比较必须忽略不定间距的组合字符,例如变音符号。Unicode标准将组合字符定义为与基本字符组合以产生新字符的字符。字符在呈现时不会自己占据间距位置。”
您可以在docs上找到有关CompareOptions
的更多信息
答案 1 :(得分:4)
在形式D和KD中进行规范化之后,该字符串将包含两个字符:一个字母和一个变音符。有必要与字母进行比较。
string stra = "á";
string strFormC = stra.Normalize(NormalizationForm.FormC);
string strFormD = stra.Normalize(NormalizationForm.FormD);
string strFormKC = stra.Normalize(NormalizationForm.FormKC);
string strFormKD = stra.Normalize(NormalizationForm.FormKD);
Console.WriteLine("C {0}", strFormC.Length); // 1
Console.WriteLine("D {0}", strFormD.Length); // 2
Console.WriteLine("KC {0}", strFormKC.Length); // 1
Console.WriteLine("KD {0}", strFormKD.Length); // 2
Console.WriteLine("a".Equals(strFormD[0].ToString())); // True
Console.WriteLine("a".Equals(strFormKD[0].ToString())); // True
我们可以使用正则表达式删除所有变音符。
\p{M}
-是Unicode category表示所有变音符号。
string stra = "á";
string strFormD = stra.Normalize(NormalizationForm.FormD);
var result = Regex.Replace(strFormD, @"\p{M}", string.Empty);
Console.WriteLine("a".Equals(result)); // True
Console.WriteLine("a" == result); // True