通过等效的简化字母数字字符转换非ascii多文化字符

时间:2016-01-05 14:52:38

标签: c# unicode ascii

在使用unicode字符搜索文件名时遇到问题。这些文件可能具有正确或更改的名称(替换为等效的ascii字符)。 我想制作一些代码来查找使用相同单词的文件,无论是否有变化,在同一个字符串中可能存在不一致的文化混合。 为了简单起见,我应该只管理欧洲语言的字符串。

等价例子:

Ɛpsilon <=> epsilon
København <=> Kobenhavn
Ångström <=> Angstrom
El Niño <=> El Nino
Tiếng Việt <=> Tieng Viet
Čeština <=> Cestina
encyklopædi <=> encyklopaedi
Expediția <=> Expeditia
øðrum <=> odrum
œuf <=> oeuf
μ (\u03bc) <=> µ (\u00b5)
Straße <=> Strasse

我已经找到了类似问题的一些答案,但它们基于更简单的字符串(删除重音就足够了,使用Unicode规范化和变音符号的删除),或者#34;自己做&#34;基于

How to compare Unicode characters that "look alike"?

How to convert a Unicode character to its ASCII equivalent

Replacing characters in C# (ascii)

不幸的是,Unicode规范化(自动方式)对以下字符不起作用至少

Ɛ ø ð => missing equivalence
æ œ ß => missing expansion

是否有一个函数/库可以在C#中实现这一点,其他手动转换每个众所周知的&#39;性格自己?

1 个答案:

答案 0 :(得分:0)

我不认为,有一种简单的方法可以做到这一点。可能没有普遍的标准化(即使将其限制为欧洲语言组)

所有解决方案都有手动工作:

  1. RegEx - 这应该是可能的,但是这个解决方案(一个可以完成工作的RegEx表达式)真是难以置信的疯狂。
  2. 有一个(或至少是)Total Commander的插件用于音译。但是插件是/有缺陷/不稳定的,你需要手动编写音译表。
  3. “Manual transliteration”。
  4. 我的文件名有类似的问题。但就我而言,文件名包含日文字符。这种翻译/音译有点难。

    要简化您的解决方案,您可以使用Windows中的代码页转换。 转换为ASCII(7位)可以完成工作会很好,但是没有。这只产生'?'字符。

    这个例子应该处理一些字符。

      Encoding encoding;
      string data = "Čeština, øðrum";
    
      encoding = Encoding.GetEncoding(1250);
      data = encoding.GetString(encoding.GetBytes(data)); // "Čeština, o?rum"
      encoding = Encoding.GetEncoding(1252);
      data = encoding.GetString(encoding.GetBytes(data)); // "Ceština, o?rum"
      encoding = Encoding.ASCII;
      data = encoding.GetString(encoding.GetBytes(data));
      Console.WriteLine(data); // "Ce?tina, o?rum"
    

    这并不完美,但至少你清除了一些不需要的字符而不需要替换字典。 您可以尝试添加其他代码页(也许希腊代码页会修复“μ”问题,但它可能会删除所有其他字符)

    在这些开始转换后,您可以在转换后的文本中搜索“?”字符和看,是否有'?'原始/来源中的字符。如果没有,现在可以使用替换字典来表示给定字符。

    在我的项目中,我使用替换字典(由用户在运行时手动更新未知单词)。当你的所有音译都只是单个字符时,你不需要使用一些特殊的方法,但是当出现像“ßs”这样的情况时 - > “ss”(不是'ß'+'s'=“ss”+'s'=“sss”),你需要一个排序的排序列表,需要在字符之前处理换人。列表应按字符串长度(较长的第一个)排序,而不是按字母表排序。

    <强>说明

    1. 在你的情况下,可能没有模糊转录的问题(明日=“ashita”或“asu”,或者根据周围的人物可能是不同的词)但你应该考虑一下是否确实如此。

    2. 在我的项目中,我发现有些程序存储编码错误的文件。下载程序以UTF-8格式获取正确的文件名,字节序列被解释为Encoding.Default (或“Encoding.DOS”[符号名称],或压缩文件的其他代码页)。因此,最好测试此类错误的文件名。

    3. 了解如何测试无效的文件名编码: https://stackoverflow.com/a/19068371/2826535

      1. 只有完成答案:
      2. 基于Unicode标准化的“删除重音”方法: https://stackoverflow.com/a/3288164/2826535