题
我正在寻找伪代码或示例代码,将更高位的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 库非常有帮助。
我认为你已经把它钉在头上了。鉴于您的域名有限,转换数组或哈希是您最好的选择。尝试自动化创建任何复杂的东西都没有意义。
查找数组可能是实现此目的的最简单,最快捷的方法。这是一种可以将ASCII转换为EBCDIC的方法。
尝试 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)