我在stackoverflow上找到了一个关于如何去除变音符号字符的答案,但您能否告诉我是否有可能将变音符号字符更改为非变音符号字符呢?
哦...还有,我想了解一下.NET(或其他替代方案如果不可行)。
我在stackoverflow上找到了一个关于如何去除变音符号字符的答案,但您能否告诉我是否有可能将变音符号字符更改为非变音符号字符呢?
哦...还有,我想了解一下.NET(或其他替代方案如果不可行)。
由于没有人费心发布执行此操作的代码,因此在此提供:
// \p{Mn} or \p{Non_Spacing_Mark}:
// a character intended to be combined with another
// character without taking up extra space
// (e.g. 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 格式时。这种情况很常见。你的选择基本上有两个:删除带重音符号的字符,或者尝试从带重音符号的字符中去除重音以尽可能地保留原始输入的多数内容。显然,这不是一个完美的解决方案,但比简单地删除任何 ASCII 127 以上字符的方法要好80%。从我对另一个问题的回答中复制:
不必创建自己的表,您可以将文本转换为规范形式D,其中字符表示为基本字符加上变音符号(例如,“á”将被替换为“a”后跟一个组合的尖音符)。然后可以去除所有不是ASCII字母的内容。
表仍然存在,但现在是Unicode标准的表。
您还可以尝试使用NFKD而不是NFD,以捕获更多情况。
参考资料:
一个简单的例子:
从字符串中删除变音符号:
string newString = myDiacriticsString.Normalize(NormalizationForm.FormD);
我的网站从外部来源输入数据,其中有许多奇怪的字符。我编写了以下C#函数,使用正则表达式替换重音字符并去除非美国键盘字符:
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();
}
希望能有所帮助。