我已经找到了如何在stackoverflow上删除变音符号的答案,但您能告诉我是否可以将变音字符改为非变音字符?
哦..。我想到了.NET (或者其他不可能的东西)
发布于 2008-12-01 08:21:50
从my own answer to another question复制
而不是创建您自己的表,您可以将文本转换为标准化形式D,其中字符表示为基本字符加上变音符号(例如,"á“将被"a”替换为“a”,后跟一个组合的急性重音符号)。然后,您可以剥离所有非ASCII字母的内容。
这些表仍然存在,但现在是来自Unicode标准的表。
您还可以尝试NFKD而不是NFD,以捕获更多的案例。
参考文献:
发布于 2010-07-22 23:25:27
由于从来没有人费心去发布代码来做这件事,下面是:
// \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%。
发布于 2008-12-01 08:22:03
退一步考虑你为什么要这样做可能也是值得的。如果您试图删除您认为无关紧要的字符差异,则应查看Unicode排序规则算法。这是比较字符串以进行搜索或排序时忽略大小写或变音符号等差异的标准方法。
如果您计划显示修改后的文本,请考虑您的受众。您可以安全地过滤掉的内容是区域设置敏感的。在美式英语中,"Igloo“= "igloo","resume”= "résumé",但在土耳其语中,小写的i是ı(无符号),在法语中,cote的意思是报价,cété的意思是边上,céte的意思是海岸。因此,排序语言决定了哪些差异是显著的。
如果删除变音符号对您的应用程序来说是正确的解决方案,那么最安全的做法是生成您自己的表,您可以显式地向其中添加要转换的字符。
使用Unicode分解可以设计出一种通用的自动化方法。这样,您就可以将带有变音符号的字符分解为“组合”字符(变音符号)和与之组合的基本字符。过滤掉任何组合字符,你应该有“非变音”字符。
然而,自动化方法中缺乏辨别,可能会产生一些意想不到的影响。我建议在一个有代表性的文本正文上进行大量测试。
https://stackoverflow.com/questions/331279
复制相似问题