如何将8位字符转换为7位字符? (即Ü到U)

时间:2008-09-26 16:05:28

标签: ascii

我正在寻找伪代码或示例代码,以将更高位的ascii字符(例如,Ü,其扩展为ascii 154)转换为U(ascii 85)。

我最初的猜测是,由于只有大约25个与7位ascii字符类似的ascii字符,因此必须使用翻译数组。

如果您能想到其他任何事情,请告诉我。

15 个答案:

答案 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)

有一篇关于CodeProject的文章看起来不错。

使用代码页1251的转换也引起我的兴趣(参见其他答案)。

我不喜欢转换表,因为Unicode中的字符数很大,很容易错过一个。

答案 10 :(得分:0)

我认为你已经把它钉在头上了。鉴于您的域名有限,转换数组或哈希是您最好的选择。尝试自动化创建任何复杂的东西都没有意义。

答案 11 :(得分:0)

查找数组可能是实现此目的的最简单,最快捷的方法。这是一种可以将ASCII转换为EBCDIC的方法。

答案 12 :(得分:0)

高128个字符没有标准含义。他们可以根据用户的语言采取不同的解释(代码页)。

例如,请参阅 PortugueseFrench 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计划。