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

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

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

有帮助吗?

解决方案

确实如同未说明的提议: "&的iconv QUOT;函数存在以处理所有奇怪的转换,几乎所有编程语言都有,并且有一个特殊选项,它试图用近似值转换目标集中缺少的字符。

使用iconv简单地将输入的UTF-8字符串转换为7位ASCII。

否则,你总是会遇到角落情况:8位输入使用不同的代码页和不同的字符集(因此根本无法使用你的转换表),忘记映射最后一个愚蠢的重音字符(你映射了)所有严重/尖锐的口音,但忘了映射捷克卡龙或北欧'°')等。

当然,如果您想将解决方案应用于一个小的特定问题(为您的音乐集合制作文件系统友好的文件名),那么查找数组就是可行的方法(对于上面的每个代码编号都是一个数组) 128根据JeeBee的建议绘制128以下的近似值,或vIceBerg提出的源/目标对,具体取决于您选择的语言中已有的替换函数),因为它很快被黑客攻击并快速检查缺失的元素。

其他提示

对于.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字符替换单个重音字符。例如用德语&#252;变成了你。因此,如果你想要正确处理自然语言,它会比你想象的要复杂得多。

转换&#220;到你真的想做什么?我不知道其他语言,但用德语和#220;会成为Ue,&#246;会成为oe等等。

我认为你不能。

我经常这样做:

AccentString ='&#192;&#194;&#196;&#201;&#200;&#202; [和所有其他]'
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

我认为你好像已经钉了它。一个128字节长的字节数组,由char&amp; 127索引,包含8位字符的匹配7位字符。

嗯,为什么不用iconv来改变字符串的编码?

这实际上取决于源字符串的性质。如果您知道字符串的编码,并且您知道它是一个8位编码&#8212;例如,ISO Latin 1或类似的&#8212;那么一个简单的静态数组就足够了:

static const char xlate[256] = { ..., ['é'] = 'e', ..., ['Ü'] = 'U', ... }
...
new_c = xlate[old_c];

另一方面,如果您有不同的编码,或者您使用的是UTF-8编码的字符串,您可能会在 ICU 库非常有帮助。

有一篇关于 CodeProject 的文章很好看。

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

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

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

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

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

例如,请参阅 葡萄牙语加拿大法语

除非您知道代码页,否则您的“翻译”会在有时会错。

如果您要假设某个代码页(例如原始的IBM代码页),那么翻译阵列将起作用,但对于真正的国际用户来说,这将是错误的。

这就是为什么unicode比较旧的代码页系统更受青睐的原因之一。

严格来说,ASCII只有7位。

尝试 uni2ascii 计划。

我使用此函数修复带有重音的变量,以便从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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top