我陷入了一个令人惊讶的问题。
我在应用程序中加载了一个文本文件,并且有一些逻辑来比较 µ 的值。
我意识到即使文本相同,比较值也是错误的。
Console.WriteLine("μ".Equals("µ")); // returns false
Console.WriteLine("µ".Equals("µ")); // return true
在后面的行中,字符 µ 被复制粘贴。
然而,这些可能不是唯一这样的角色。
C#中有没有办法比较看起来相同但实际上不同的字符?
因为它确实是不同的符号,即使它们看起来相同,第一个是实际的字母并且有字符code = 956 (0x3BC)
第二个是微标志并且有181 (0xB5)
.
参考:
- 符号库 > Unicode字符库 > Unicode区段:希腊语小写字母 MU (U+03BC) http://www.fileformat.info/info/unicode/char/03BC/index.htm
-
Unicode字符集 'MICRO SIGN' (U+00B5) http://www.fileformat.info/info/unicode/char/00B5/index.htm
因此,如果您想比较它们并且需要它们相等,则需要手动处理,或者在比较之前将一个字符替换为另一个字符。或者使用下面的代码:
public void Main()
{
var s1 = "μ";
var s2 = "µ";
Console.WriteLine(s1.Equals(s2)); // false
Console.WriteLine(RemoveDiacritics(s1).Equals(RemoveDiacritics(s2))); // true
}
static string RemoveDiacritics(string text)
{
var normalizedString = text.Normalize(NormalizationForm.FormKC);
var stringBuilder = new StringBuilder();
foreach (var c in normalizedString)
{
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
stringBuilder.Append(c);
}
}
return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}
And the Demo http://www.fileformat.info/info/unicode/char/03BC/index.htm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)