在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
相关产品推荐
相关产品推荐

