我正在寻找伪代码或示例代码,以将更高位的ascii字符(例如,将其扩展为ascii 154)转换为U(ascii 85).
我最初的猜测是,由于只有大约25个ascii字符与7bit 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替换单个重音字符.例如德语ü成为你.因此,如果你想要正确处理自然语言,它会比你想象的要复杂得多.
是否真的将Ü转换为U你想做什么?我不知道其他语言,但在德语中Ü会成为Ue,ö会成为oe等.
我想你不能.
我经常这样做:
AccentString ='ÀÂÄÉÈÈ[和所有其他]'
ConvertString ='AAAEEE [和所有其他]'
在AccentString中查找char并将其替换为ConvertString中的相同索引
HTH
在代码页1251中,字符用2个字节编码:一个用于基本字符,一个用于变化.然后,当您以ASCII格式编码时,只保留基本字符.
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
确实如同未说明的提议:"iconv"函数用于处理所有奇怪的转换,几乎所有编程语言都可用,并且有一个特殊选项,它试图用近似值转换目标集中缺少的字符.
使用iconv只需将输入的UTF-8字符串转换为7位ASCII.
否则,你总是会碰到一个角落的情况:一个8位输入使用不同的代码页和一组不同的字符(因此你的转换表根本不起作用),忘了映射一个最后一个愚蠢的重音字符(你映射了所有的坟墓/急性口音,但忘了映射捷克卡龙或北欧'°')等.
当然,如果您想将解决方案应用于一个小的特定问题(为您的音乐集合制作文件系统友好的文件名),那么查找数组就是最佳选择(对于每个代码编号超过128的数组,由JeeBee提出的128以下的近似值,或vIceBerg提出的源/目标对,取决于您选择的语言中已有的替换函数),因为它很快被黑客攻击并快速检查缺失的元素.