我正在寻找伪代码或示例代码,以将更高位的ascii字符(例如,Ü,其扩展为ascii 154)转换为U(ascii 85)。
我最初的猜测是,由于只有大约25个与7位ascii字符类似的ascii字符,因此必须使用翻译数组。
如果您能想到其他任何事情,请告诉我。
答案 0 :(得分:28)
对于.NET用户,article in CodeProject(感谢GvS's tip)确实比我到目前为止看到的任何其他问题更准确地回答了问题。
然而,该文章中的代码(在解决方案#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 Annex #15。
答案 1 :(得分:17)
大多数语言都有标准方法用标准ASCII替换重音字符,但它取决于语言,并且通常涉及用两个ASCII字符替换单个重音字符。例如在德国ü成为你。因此,如果你想要正确处理自然语言,它会比你想象的要复杂得多。
答案 2 :(得分:11)
将Ü转换为U真的是你想要做的吗?我不知道其他语言,但在德语中Ü会成为Ue,ö会成为oe等。
答案 3 :(得分:6)
我认为你不能。
我经常这样做:
AccentString ='ÀÂÄÉÈÊ[和所有其他]' ConvertString ='AAAEEE [和所有其他]'
在AccentString中查找char并将其替换为ConvertString中的相同索引
HTH
答案 4 :(得分:6)
在代码页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
答案 5 :(得分:5)
确实如同未说明的提议: “iconv”函数用于处理所有奇怪的转换,几乎适用于所有编程语言,并且有一个特殊选项,试图用近似值转换目标集中缺失的字符。
使用iconv简单地将输入的UTF-8字符串转换为7位ASCII。
否则,你总是会遇到角落情况:8位输入使用不同的代码页和不同的字符集(因此根本无法使用你的转换表),忘记映射最后一个愚蠢的重音字符(你映射了)所有严重/尖锐的口音,但忘了映射捷克卡龙或北欧'°')等。
当然,如果您想将解决方案应用于一个小的特定问题(为您的音乐集合制作文件系统友好的文件名),那么查找数组就是可行的方法(对于上面的每个代码编号都是一个数组) 128根据JeeBee的建议绘制128以下的近似值,或vIceBerg提出的源/目标对,具体取决于您选择的语言中已有的替换函数),因为它很快被黑客攻击并快速检查缺失的元素。
答案 6 :(得分:1)
我认为你好像已经钉了它。一个128字节长的字节数组,由char&amp; 127索引,包含8位字符的匹配7位字符。
答案 7 :(得分:1)
嗯,为什么不用iconv来改变字符串的编码?
答案 8 :(得分:1)
这实际上取决于源字符串的性质。如果您知道字符串的编码,并且您知道它是8位编码 - 例如,ISO Latin 1或类似 - 那么一个简单的静态数组就足够了:
static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... }
...
new_c = xlate[old_c];
另一方面,如果你有不同的编码,或者你使用的是UTF-8编码的字符串,你可能会发现ICU库中的函数非常有帮助。
答案 9 :(得分:1)
答案 10 :(得分:0)
我认为你已经把它钉在头上了。鉴于您的域名有限,转换数组或哈希是您最好的选择。尝试自动化创建任何复杂的东西都没有意义。
答案 11 :(得分:0)
查找数组可能是实现此目的的最简单,最快捷的方法。这是一种可以将ASCII转换为EBCDIC的方法。
答案 12 :(得分:0)
高128个字符没有标准含义。他们可以根据用户的语言采取不同的解释(代码页)。
例如,请参阅 Portuguese 与 French Canadian
除非您知道代码页,否则您的“翻译”有时会出错。
如果您要假设某个代码页(例如原始的IBM代码页),那么翻译阵列将起作用,但对于真正的国际用户来说,这将是错误的。
这就是为什么unicode比较旧的代码页系统更受青睐的原因之一。
严格来说,ASCII只有7位。
答案 13 :(得分:0)
我使用此函数修复带有重音的变量,以便从VB6传递给soap函数:
Function FixAccents(ByVal Valor As String) As String
Dim x As Long
Valor = Replace(Valor, Chr$(38), "&#" & 38 & ";")
For x = 127 To 255
Valor = Replace(Valor, Chr$(x), "&#" & x & ";")
Next
FixAccents = Valor
End Function
在soap函数中,我这样做(对于变量Filename):
FileName = HttpContext.Current.Server.HtmlDecode(FileName)
答案 14 :(得分:0)
尝试uni2ascii计划。