恢复编码错误的文件名

Fel*_*rri 3 python unicode encode decode cp1251

我一直在为这个问题苦苦挣扎,但编码工作非常痛苦,我必须向您的聪明人寻求帮助。

在我去乌克兰的一次旅行中,一位朋友将一些乌克兰命名的文件复制到我的笔式驱动器中。但是,正如您所料,在复制到我的计算机的过程中,文件名变得无法读取垃圾,例如:

Ôàíòîì
Run Code Online (Sandbox Code Playgroud)

好吧,我有充分的理由相信原始文件名是使用 CP1251 编码的(我知道这一点是因为我手动检查了编码表并设法正确翻译了乐队的名称)。显然发生的事情是,在复制过程中,CP1251 代码被维护,操作系统现在只是将它们解释为 Unicode 代码。

我尝试使用以下脚本“解释”Python 中的代码:

print u"Ôàíòîì".decode('cp1251')
Run Code Online (Sandbox Code Playgroud)

不过感觉不太对。结果也完全是垃圾:

?”? ?­???®?¬
Run Code Online (Sandbox Code Playgroud)

如果我做:

print repr(u"Ôàíòîì".decode('cp1251'))
Run Code Online (Sandbox Code Playgroud)

我获得:

u'\u0413\u201d\u0413\xa0\u0413\xad\u0413\u0406\u0413\xae\u0413\xac'
Run Code Online (Sandbox Code Playgroud)

我发现,如果我能得到 Unicode 中的所有代码点,并将它们偏移 0x350,我会将它们放置在乌克兰西里尔文的正确位置。但我不知道该怎么做,可能有一个答案在概念上比这更正确。

任何帮助将不胜感激!

编辑:这是正确翻译的示例

Ôàíòîì 应该翻译成??????。

Ô 0x00D4 -> ? 0x0424
à 0x00E0 -> ? 0x0430
í 0x00ED -> ? 0x043D
ò 0x00F2 -> ? 0x0442
î 0x00EE -> ? 0x043E
ì 0x00EC -> ? 0x043C
Run Code Online (Sandbox Code Playgroud)

正如我之前所说,正确和错误的代码点之间有一个 0x0350 偏移量。

(好吧,文件是音乐文件......我猜你怀疑......)

其他一些测试字符串(我不知道其翻译):Áåç êîíò›îë?Äâîº Êàï_òîøêà Ïîäèâèñü

Rol*_*ony 5

>>> a = u'Ôàíòîì'.encode('8859').decode('cp1251')   
>>> print a   
??????    
Run Code Online (Sandbox Code Playgroud)

如果您查看样本中的单个字符,其中大部分来自西里尔文,但其中还有其他来自希腊语和科普特语的字符,Latin Extended B 和 u'fe52' 是后面的句号。所以有点乱。
编辑:

a = u'Ôàíòîì'.encode('cp1252').decode('cp1251')
打印一个
??????
a = u'Äâîº Êàï_òîøêà'.encode('cp1252').decode('cp1251')
打印
?? ???_?????
a = u'Ïîäèâèñü'.encode('cp1252').decode('cp1251')
打印
????????
a = u'Áåç êîíò›îë'.encode('cp1252').decode('cp1251')
打印
??? ????›??

cp1252 适用于给定的样本,除了Áåç êîíò›îë?拉丁小连字 Fl U+FB02 似乎是多余的