我的初步猜测是,由于只有大约25个ASCII字符类似于7位ASCII字符,因此需要使用一个翻译数组。
如果您能想到其他任何方法,请告诉我。
对于.NET用户,CodeProject中的文章(感谢GvS的技巧)确实比我迄今看到的其他任何答案都更正确地回答了这个问题。
然而,该文章中的代码(解决方案#1)很繁琐。下面是一个紧凑版:
// Based on http://www.codeproject.com/Articles/13503/Stripping-Accents-from-Latin-Characters-A-Foray-in
private static string LatinToAscii(string inString)
{
var newStringBuilder = new StringBuilder();
newStringBuilder.Append(inString.Normalize(NormalizationForm.FormKD)
.Where(x => x < 128)
.ToArray());
return newStringBuilder.ToString();
}
为了更好地解释这个答案,这种方法使用了String.Normalize,它的作用是:
返回一个新字符串,其文本值与此字符串相同,但其二进制表示采用指定的Unicode规范形式。
具体来说,在这种情况下,我们使用NormalizationForm FormKD
,在MSDN文档中被描述为:
FormKD-表示使用全兼容分解对Unicode字符串进行规范化。
有关Unicode规范化形式的更多信息,请参见Unicode附录#15。
大多数语言都有一种标准的方式将带重音的字符替换为标准的 ASCII 字符,但这取决于语言,通常涉及将单个带重音的字符替换为两个 ASCII 字符。例如,在德语中,ü 会被替换为 ue。因此,如果您想正确处理自然语言,它比您想象的要复杂得多。
真的想将Ü转换为U吗?我不知道其他语言,但在德语中,Ü会变成Ue,ö会变成oe等等。
我认为你不能这样做。
我通常会这样做:
AccentString = 'ÀÂÄÉÈÊ[以及所有其他字符]'
ConvertString = 'AAAEEE[以及所有其他字符]'
查找AccentString中的字符,并将其替换为ConvertString中相同索引处的字符。
希望对你有所帮助。
public string RemoveDiacritics(string text)
{
return System.Text.Encoding.ASCII.GetString(System.Text.Encoding.GetEncoding(1251).GetBytes(text));
}
来源: http://www.clt-services.com/blog/post/Enlever-les-accents-dans-une-chaine-(proprement).aspx
该文章介绍了如何正确地从字符串中移除重音符号。这在 IT 技术中经常用到,比如当你需要将字符串用作文件名或 URL 时。通过使用 C# 中的特定类和方法,可以轻松地实现这一目标。如通过unexist提出的建议: "iconv"函数存在于几乎所有编程语言中,可处理所有奇怪的转换,并具有特殊选项,尝试使用近似值将目标集中缺失的字符进行转换。
使用iconv将输入的UTF-8字符串简单地转换为7位ASCII。
否则,您总会遇到角落案例:8位输入使用不同的代码页和不同的字符集(因此根本无法与您的转换表一起使用),忘记映射一个最后的愚蠢重音字符(您映射了所有重/轻音符号,但忘记了映射捷克符号或北欧'°'等)等等。
当然,如果您想将解决方案应用于小型特定问题(为音乐收藏创建文件系统友好的文件名),则查找数组是正确的方法(对于每个超过128的代码号码映射为128下面的近似值,如JeeBee所建议的;或者vIceBerg提出的源/目标对取决于您选择的语言中已有哪些替换函数),因为它可以快速地组合并快速检查缺少的元素。
我认为你已经掌握了它。一个128字节长的字节数组,由char&127索引,包含8位比特字符的匹配7位字符。