Encoding 在tar未归档后用西里尔字母解码cp866编码的文件名

Encoding 在tar未归档后用西里尔字母解码cp866编码的文件名,encoding,tar,Encoding,Tar,我有几个文件是通过在macOS下使用gnutar取消归档一些tar归档而获得的。这些文件的名称类似于%8A%AE%AD%E1⠭⨭ - %84%87%FCML1.ipynb由于使用西里尔字母。似乎%8A等都是cp866代码,但也有一些unicode字符(如⨭),似乎是某些字节序列的unicode表示形式,这些字节序列碰巧是有效的utf-8代码。我想将所有内容解码为unicode/UTF-8,以便能够重命名我的文件。我该怎么做呢?这个Python函数可以帮助: def decode_escaped_

我有几个文件是通过在macOS下使用gnu
tar
取消归档一些tar归档而获得的。这些文件的名称类似于
%8A%AE%AD%E1⠭⨭ - %84%87%FCML1.ipynb
由于使用西里尔字母。似乎
%8A
等都是cp866代码,但也有一些unicode字符(如
),似乎是某些字节序列的unicode表示形式,这些字节序列碰巧是有效的utf-8代码。我想将所有内容解码为unicode/UTF-8,以便能够重命名我的文件。我该怎么做呢?

这个Python函数可以帮助:

def decode_escaped_cp866(s):
    out = []
    for token in re.finditer(r"%([0-9A-F]{2})|(.)", s):
        if token.group(1) is not None:
            out.append(bytes([int(token.group(1), 16)]))
        elif token.group(2) is not None:
            out.append(token.group(2).encode('utf-8'))
    return b"".join(out).decode('cp866')

print(decode_escaped_cp866("%8A%AE%AD%E1⠭⨭ - %84%87 %FCML1.ipynb"))
# Константин - ДЗ №ML1.ipynb