如何删除字符串上的重音符号?[重复]
:
9年前关闭。
如何从.NET中的字符串中删除变音符号(重音符号)?
我有以下字符串
áéíóú
我需要将其转换为
aeiou
我该如何实现?(我不需要比较,我需要保存新字符串)
与如何从.NET中的字符串中删除变音符号(重音符号)不重复吗?。那里被接受的答案什么也没有解释,这就是为什么我“重新打开”它的原因。
回答:
这取决于要求。对于大多数用途,然后将其标准化为NFD,然后过滤掉所有合并的字符即可。在某些情况下,将NFKD标准化更为合适(如果您还希望删除字符之间的其他区别)。
其他一些区别将不会被抓住,特别是抚摸的拉丁字符。对于某些语言,也没有明确的非特定于语言的方式(应将ł视为等同于l或w?),因此您可能需要自定义其他方法。
在某些情况下,为了确保Unicode版本之间的一致性,NFD和NFKD不能按预期工作。
因此:
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);
}
在这里,我们为上述问题案例设置了默认设置,只是忽略了它们。我们还从生成字符的枚举中拆分出了构建字符串的方法,因此在不需要对结果进行字符串操作的情况下,我们就不必浪费时间(例如,我们将编写字符以输出下一个字符,或者做进一步的字符处理)
-按字符操作)。
我们还想将ł和also转换为l和L,但没有其他特殊问题的示例案例可以使用:
private static char NormaliseLWithStroke(char c){
switch(c)
{
case 'ł':
return 'l';
case 'Ł':
return 'L';
default:
return c;
}
}
在上述情况下,将其与上述方法一起使用将可消除笔画以及可分解的变音符号。
以上是 如何删除字符串上的重音符号?[重复] 的全部内容, 来源链接: utcz.com/qa/416661.html