如何在C#中比较字符l与波兰语字符ł并返回true
解决C#中字符'l'与波兰语字符'ł'相等比较的问题
问题原因
波兰语的ł(Unicode U+0142)是一个独立的预组合字符,它无法通过NormalizationForm.FormD分解为基础字符l加上非间距标记,所以常规的去重音方法对它无效。
可行解决方案
方法1:自定义字符替换映射
直接将ł替换为l后再比较,适合简单场景:
public static void Main() { string str1 = "Przesyłka"; string str2 = "Przesylka"; string normalizedStr1 = NormalizePolishChars(str1); string normalizedStr2 = NormalizePolishChars(str2); Console.WriteLine(normalizedStr1.Equals(normalizedStr2)); // 输出 True } static string NormalizePolishChars(string input) { Dictionary<char, char> polishCharMap = new Dictionary<char, char> { {'ł', 'l'}, {'Ł', 'L'}, // 可扩展其他波兰语特殊字符,比如ą→a、ę→e等 }; return new string(input.Select(c => polishCharMap.ContainsKey(c) ? polishCharMap[c] : c).ToArray()); }
方法2:使用波兰语区域性排序规则比较
利用波兰语(pl-PL)的区域性排序规则,这类规则会将ł和l视为等效字符:
public static void Main() { Console.WriteLine(StringComparer.Create(new CultureInfo("pl-PL"), true).Equals("l", "ł")); // 输出 True Console.WriteLine(StringComparer.Create(new CultureInfo("pl-PL"), true).Equals("Przesyłka", "Przesylka")); // 输出 True }
方法3:基于CompareInfo的规则比较
通过CompareInfo指定忽略非间距标记和大小写的规则,结合波兰语区域性实现判断:
public static void Main() { CompareInfo compareInfo = new CultureInfo("pl-PL").CompareInfo; bool isEqual = compareInfo.Compare("l", "ł", CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0; Console.WriteLine(isEqual); // 输出 True }
内容的提问来源于stack exchange,提问作者JKennedy
相关产品推荐
相关产品推荐

