You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:52:35