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

在C#中匹配带变音符号与不带变音符号的越南语姓名

解决越南语姓名变音符号匹配问题

你的代码无法匹配带变音符号的姓名,核心原因是仅做字符串归一化不足以移除变音标记。像ă这类字符,经过Normalize(NormalizationForm.FormC)处理后,只是将组合字符合并,但变音标记的信息仍然保留,导致直接比较无法相等。

正确的做法是:先将字符串归一化为分解形式(FormD),过滤掉所有Unicode非间距标记字符,再合并为合成形式后进行比较。

完整实现代码

using System;
using System.Text;
using System.Globalization;

class Program
{
    static void Main(string[] args)
    {
        string name1 = "Dan";
        string name2 = "Dăn";

        bool match = CompareStrings(name1, name2);

        Console.WriteLine(match ? "The strings match." : "The strings do not match.");
    }

    static bool CompareStrings(string str1, string str2)
    {
        // 移除变音符号后再比较
        string str1Clean = RemoveDiacritics(str1);
        string str2Clean = RemoveDiacritics(str2);

        return str1Clean.Equals(str2Clean, StringComparison.InvariantCultureIgnoreCase);
    }

    static string RemoveDiacritics(string text)
    {
        // 归一化为分解形式,将带变音的字符拆分为基础字符+变音标记
        string normalized = text.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        foreach (char c in normalized)
        {
            // 过滤掉非间距标记(即变音符号)
            UnicodeCategory category = CharUnicodeInfo.GetUnicodeCategory(c);
            if (category != UnicodeCategory.NonSpacingMark)
            {
                sb.Append(c);
            }
        }

        // 再归一化为合成形式,确保字符格式统一
        return sb.ToString().Normalize(NormalizationForm.FormC);
    }
}

说明

  • RemoveDiacritics方法先将字符串转为FormD分解形式,把带变音的字符拆成基础字符和独立的变音标记;
  • 遍历字符时过滤掉所有属于NonSpacingMark的变音标记,只保留基础字符;
  • 最后再转回FormC合成形式,保证字符串格式统一,避免后续比较出现问题;
  • 比较时使用InvariantCultureIgnoreCase,确保大小写不敏感且不受区域设置影响。

内容的提问来源于stack exchange,提问作者Chew Hong Yu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:47:36