我有以下字符串
áéíóú
Run Code Online (Sandbox Code Playgroud)
我需要将其转换为
aeiou
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现它?(我不需要比较,我需要新的字符串来保存)
不重复如何从.NET中的字符串中删除变音符号(重音符号)?.那里接受的答案没有解释任何事情,这就是为什么我"重新开启"它.
Jon*_*nna 23
这取决于要求.对于大多数用途,然后归一化为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);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们对上面提到的问题情况有一个默认值,它只是忽略它们.我们还从生成字符枚举中拆分构建字符串,因此在不需要对结果进行字符串操作的情况下我们不必浪费(比如说我们要将字符写入下一个输出,或者再做一些char -by-char操纵).
我们想要将ł和Ł转换为l和L,但没有其他特殊问题可以使用的示例:
private static char NormaliseLWithStroke(char c)
{
switch(c)
{
case '?':
return 'l';
case '?':
return 'L';
default:
return c;
}
}
Run Code Online (Sandbox Code Playgroud)
与上述方法一起使用它将结合在一起除去中风,以及可分解的变音符号.
cic*_*chy 15
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));
}
Run Code Online (Sandbox Code Playgroud)