在使用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;性格自己?
答案 0 :(得分:0)
我不认为,有一种简单的方法可以做到这一点。可能没有普遍的标准化(即使将其限制为欧洲语言组)。
所有解决方案都有手动工作:
我的文件名有类似的问题。但就我而言,文件名包含日文字符。这种翻译/音译有点难。
要简化您的解决方案,您可以使用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”),你需要一个排序的排序列表,需要在字符之前处理换人。列表应按字符串长度(较长的第一个)排序,而不是按字母表排序。
<强>说明强>:
在你的情况下,可能没有模糊转录的问题(明日=“ashita”或“asu”,或者根据周围的人物可能是不同的词)但你应该考虑一下是否确实如此。
在我的项目中,我发现有些程序存储编码错误的文件。下载程序以UTF-8格式获取正确的文件名,字节序列被解释为Encoding.Default
(或“Encoding.DOS
”[符号名称],或压缩文件的其他代码页)。因此,最好测试此类错误的文件名。
了解如何测试无效的文件名编码: https://stackoverflow.com/a/19068371/2826535
基于Unicode标准化的“删除重音”方法: https://stackoverflow.com/a/3288164/2826535