如何删除string上的重音符号?
可能重复:
如何从.NET中的string中删除变音符号(重音符号)?
我有以下string
áéíóú
我需要将其转换为
aeiou
我怎样才能做到这一点? (我不需要比较,我需要新的string来保存)
不是重复的如何从.NET中的string中删除变音符号(重音符号)? 。 那里接受的答案没有解释任何东西,这就是为什么我“重新”打开它。
这取决于要求。 对于大多数用途,然后归一化到NFD,然后过滤出所有组合的字符将做。 在某些情况下,标准化为NFKD更合适(如果您还想删除字符之间的一些进一步的区别)。
一些其他的区别不会被这个抓住,特别是抚摸拉丁字符。 对于某些应用程序,也没有明确的非特定于语言环境的方法(应该认为它们与l或w相等),所以您可能需要在此之外进行自定义。
还有一些情况下NFD和NFKD不能像预期的那样工作,以便Unicode版本之间保持一致。
因此:
public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm, Func<char, char> customFolding) { foreach(char c in src.Normalize(compatNorm ? NormalizationForm.FormKD : NormalizationForm.FormD)) switch(CharUnicodeInfo.GetUnicodeCategory(c)) { case UnicodeCategory.NonSpacingMark: case UnicodeCategory.SpacingCombiningMark: case UnicodeCategory.EnclosingMark: //do nothing break; default: yield return customFolding(c); break; } } public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm) { return RemoveDiacritics(src, compatNorm, c => c); } public static string RemoveDiacritics(string src, bool compatNorm, Func<char, char> customFolding) { StringBuilder sb = new StringBuilder(); foreach(char c in RemoveDiacriticsEnum(src, compatNorm, customFolding)) sb.Append(c); return sb.ToString(); } public static string RemoveDiacritics(string src, bool compatNorm) { return RemoveDiacritics(src, compatNorm, c => c); }
这里我们对上面提到的问题案例有一个默认的设置,只是忽略了它们。 我们还分解了构build一个string来生成字符枚举,所以我们不必浪费在没有必要对结果进行string操作的情况下(比如说我们要写下字符来输出下一个字符,或者再做一些字符字符操作)。
一个例子,我们也想把ł和Ł转换成l和L,但是没有其他专门的问题可以使用:
private static char NormaliseLWithStroke(char c) { switch(c) { case 'ł': return 'l'; case 'Ł': return 'L'; default: return c; } }
与上述方法一起使用将结合在这种情况下去除中风,以及可分解的变音符号。
public string RemoveDiacritics(string input) { string stFormD = input.Normalize(NormalizationForm.FormD); int len = stFormD.Length; StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { System.Globalization.UnicodeCategory uc = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stFormD[i]); if (uc != System.Globalization.UnicodeCategory.NonSpacingMark) { sb.Append(stFormD[i]); } } return (sb.ToString().Normalize(NormalizationForm.FormC)); }