![如何删除字符串上的重音符号?[重复],第1张 如何删除字符串上的重音符号?[重复],第1张](/aiimages/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8A%E7%9A%84%E9%87%8D%E9%9F%B3%E7%AC%A6%E5%8F%B7%EF%BC%9F%5B%E9%87%8D%E5%A4%8D%5D.png)
这取决于要求。对于大多数用途,然后将其标准化为NFD,然后过滤掉所有合并的字符即可。在某些情况下,将NFKD标准化更为合适(如果您还希望删除字符之间的其他区别)。
其他一些区别将不会被抓住,特别是抚摸的拉丁字符。对于某些语言,也没有明确的非特定于语言的方式(应将ł视为等同于l或w?),因此您可能需要自定义其他方法。
在某些情况下,为了确保Unipre版本之间的一致性,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(CharUnipreInfo.GetUnipreCategory(c)) { case UnipreCategory.NonSpacingMark: case UnipreCategory.SpacingCombiningMark: case UnipreCategory.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; }}在上述情况下,将其与上述方法一起使用将可消除笔画以及可分解的变音符号。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)