我在使用 unicode 字符搜索文件名时遇到问题。这些文件可能具有正确或更改的名称(替换为等效的 ascii 字符)。\n我想编写一些代码来查找使用相同单词(无论更改与否)的文件,并且同一字符串内可能存在不连贯的文化混合。\n为了保留它简单,我应该只管理欧洲语言的字符串。
\n\n等价示例:
\n\n\xc6\x90psilon <=> epsilon\nK\xc3\xb8benhavn <=> Kobenhavn\n\xc3\x85ngstr\xc3\xb6m <=> Angstrom\nEl Ni\xc3\xb1o <=> El Nino\nTi\xe1\xba\xbfng Vi\xe1\xbb\x87t <=> Tieng Viet\n\xc4\x8ce\xc5\xa1tina <=> Cestina\nencyklop\xc3\xa6di <=> encyklopaedi\nExpedi\xc8\x9bia <=> Expeditia\n\xc3\xb8\xc3\xb0rum <=> odrum\n\xc5\x93uf <=> oeuf\n\xce\xbc (\\u03bc) <=> \xc2\xb5 (\\u00b5)\nStra\xc3\x9fe <=> Strasse\nRun Code Online (Sandbox Code Playgroud)\n\n我已经找到了类似问题的一些答案,但它们基于更简单的字符串(其中删除重音就足够了,使用 Unicode 规范化和删除变音符号),或基于“自己动手”。
\n\n\n\n如何将 Unicode 字符转换为其等效的 ASCII 字符
\n\n\n\n不幸的是,Unicode 规范化(自动方式)至少对以下字符不起作用:
\n\n\xc6\x90 \xc3\xb8 \xc3\xb0 => missing equivalence\n\xc3\xa6 \xc5\x93 \xc3\x9f => missing expansion\nRun Code Online (Sandbox Code Playgroud)\n\n除了我自己手动转换每个“众所周知”字符之外,是否有一个函数/库可以在 C# 中实现此目的?
\n我不认为有一种简单的方法可以做到这一点。可能没有普遍的标准化(即使您将其限制为欧洲语言组)。
\n\n所有解决方案都有手动工作:
\n\n我对文件名也有类似的问题。但就我而言,文件名包含日语字符。这个翻译/音译有点困难。
\n\n为了简化您的解决方案,您可以使用 Windows 中的代码页转换。\n如果转换为 ASCII(7 位)可以完成这项工作,那就太好了,但不行。这仅产生 \'?\' 字符。
\n\n这个例子应该处理一些字符。
\n\n Encoding encoding;\n string data = "\xc4\x8ce\xc5\xa1tina, \xc3\xb8\xc3\xb0rum";\n\n encoding = Encoding.GetEncoding(1250);\n data = encoding.GetString(encoding.GetBytes(data)); // "\xc4\x8ce\xc5\xa1tina, o?rum"\n encoding = Encoding.GetEncoding(1252);\n data = encoding.GetString(encoding.GetBytes(data)); // "Ce\xc5\xa1tina, o?rum"\n encoding = Encoding.ASCII;\n data = encoding.GetString(encoding.GetBytes(data));\n Console.WriteLine(data); // "Ce?tina, o?rum"\nRun Code Online (Sandbox Code Playgroud)\n\n它并不完美,但至少您不需要替换字典就清除了一些不需要的字符。\n您可以尝试添加其他代码页(也许希腊代码页可以解决“\xce\xbc”问题,但它可能会删除所有其他字符)。
\n\n在这些开始转换之后,您可以在转换后的文本中搜索“?”字符,并查看原始/源代码中是否有“?”字符。如果没有,现在您可以使用给定字符的替换字典。
\n\n在我的项目中,我使用替换字典(用户在运行时手动更新未知单词)。当你所有的音译都只是单个字符时,你不需要使用一些特殊的方法,但是当出现像“\xc3\x9fs”-->“ss”这样的情况时(而不是\'\xc3\x9f\' + \ 's\' = "ss" + \'s\' = "sss"),您将需要一个排序的替换列表,需要在字符替换之前对其进行处理。该列表应按字符串长度排序(较长的在前)而不是按字母顺序排序。
\n\n评论:
\n\n在你的情况下,可能不存在歧义转录的问题(\xe6\x98\x8e\xe6\x97\xa5 =“ashita”或“asu”,或者根据周围的字符可能是不同的单词),但你应该考虑如果确实如此。
在我的项目中,我发现有些程序存储的文件编码错误。下载程序以 UTF-8 格式获取正确的文件名,字节序列被解释为Encoding.Default (或“ Encoding.DOS” [符号名称],或压缩文件的其他代码页)。因此,最好测试文件名是否存在此类错误。
了解如何测试无效的文件名编码:\n /sf/answers/1334786001/
\n\n基于 Unicode 规范化的“删除重音符号”方法:\n /sf/answers/230171511/
\n| 归档时间: |
|
| 查看次数: |
3061 次 |
| 最近记录: |