如何改变变音符号为非变音符号

我已经find了一个答案,如何删除在stackoverflow变音符号,但你能告诉我,如果有可能改变变音符号非变音符号?

哦..我想.NET(或其他如果不可能)

从我自己的答案复制到另一个问题 :

而不是创build自己的表格,而是可以将文本转换为标准化表格D,其中字符表示为基本字符加上区分符号(例如,“á”将被replace为“a”,后面跟着组合的尖锐重音)。 然后你可以去掉所有不是ASCII字母的东西。

这些表格依然存在,但是现在是来自Unicode标准的表格。

你也可以尝试NFKD,而不是NFD,以抓住更多的案例。

参考文献:

由于没有人曾经烦恼地发布代码来做到这一点,这里是:

// \p{Mn} or \p{Non_Spacing_Mark}: // a character intended to be combined with another // character without taking up extra space // (eg accents, umlauts, etc.). private readonly static Regex nonSpacingMarkRegex = new Regex(@"\p{Mn}", RegexOptions.Compiled); public static string RemoveDiacritics(string text) { if (text == null) return string.Empty; var normalizedText = text.Normalize(NormalizationForm.FormD); return nonSpacingMarkRegex.Replace(normalizedText, string.Empty); } 

注意:需要这样做的一个重要原因是,当您要集成到只能执行ascii的第三方系统,而您的数据是unicode的时候。 这很常见。 您的选项基本上是:删除重音字符,或试图从重音字符中删除重音,以尝试尽可能保留原始input。 显然,这不是一个完美的解决scheme,但比简单地删除任何上面的ASCII字符127要好80%。

退一步来考虑为什么要这么做也是值得的。 如果您试图删除您认为不重要的字符差异,则应该查看Unicode归类algorithm。 比较string进行search或sorting时,这是忽略大小写或变音符号等差异的标准方法。

如果您打算显示修改后的文本,请考虑您的受众。 你可以安全地过滤掉的地方是敏感的。 在美国英语中,“Igloo”=“圆顶”和“简历”=“简历”,但在土耳其语中,小写字母I(无点),法语中的cote意思是引用,côté意思是侧面,côte意思是海岸。 因此,整理语言决定了哪些差异是显着的。

如果删除变音符号是您的应用程序的正确解决scheme,那么生成您自己的表格是最安全的,您可以明确地添加要转换的字符。

可以使用Unicode分解来devise一个通用的自动化方法。 通过这种方式,可以将一个带有变音符的字符分解为“组合”字符(变音符号)和与之组合的基本字符。 过滤掉任何一个组合字符的东西,你应该有“非变音”的。

然而,在自动化方法中缺乏歧视可能会产生一些意想不到的效果。 我会推荐大量的testing文本的代表性的身体。

举一个简单的例子:

从string中删除变音符号:

 string newString = myDiacriticsString.Normalize(NormalizationForm.FormD); 

我的网站从外部input有许多奇怪字符的数据。 我写了下面的C#函数来replace重音字符,并使用正则expression式去除非美国键盘字符:

  using System.Text; using System.Text.RegularExpressions; internal static string SanitizeString(string source) { return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*", string.Empty).Trim(); } 

希望它有帮助。