tar 解压后用西里尔字母解码 cp866 编码的文件名
Decoding cp866-encoded filenames with Cyrillic letters after tar unarchiving
我有几个文件是通过在 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
我有几个文件是通过在 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