Jarekczek のおかげで大きな解決策が見つかりましたが、デコードされた名前を正しく取得できませんでした。スクリプトを次のように修正しました。
#!/usr/bin/env python
# Huge thanks to https://superuser.com/questions/60379/how-can-i-create-a-zip-tgz-in-linux-such-that-windows-has-proper-filenames#190786
# and http://stackoverflow.com/questions/12456560/encoding-of-filenames-containing-non-latin-characters-while-extracting-from-tar
import tarfile
import codecs
import sys
def recover(name):
return codecs.decode(name, 'cp1251')
for tar_filename in sys.argv[1:]:
tar = tarfile.open(name=tar_filename, mode='r', bufsize=16*1024)
updated = []
for m in tar.getmembers():
m.name = recover(m.name)
updated.append(m)
tar.extractall(members=updated)
tar.close()
私がしたことは、Python の標準ライブラリ コーデックとコマンド ライン インターフェイスを使用して Windows から utf に名前をデコードし、アーカイブの名前をフィードすることでした。