現在、tar はファイル名を UTF でエンコードします
実際、tar はファイル名をまったくエンコード/デコードしません。ファイルシステムからファイルをそのままコピーするだけです。ロケールが UTF-8 ベースの場合 (多くの最新の Linux ディストリビューションのように)、それは UTF-8 になります。残念ながら、Windows ボックスのシステム コードページは決して UTF-8 ではないため、文字セットの変更を許可する WinRAR などのツールを除いて、名前は常にマングルされます。
そのため、さまざまな国の Windows リリースと組み込みの圧縮フォルダー サポートで機能する非 ASCII ファイル名の ZIP ファイルを作成することはできません。
tar および zip 形式の欠点は、固定または提供されたエンコーディング情報がないため、非 ASCII 文字は常に移植性がありません。 ASCII 以外のアーカイブ形式が必要な場合は、最新の 7z や rar などの新しい形式のいずれかを使用する必要があります。残念ながら、これらはまだ不安定です。 7zip では -mcu
が必要です コードページにない文字を検出しない限り、rar は UTF-8 を使用しません。
基本的にこれはひどい混乱であり、ASCII 以外の文字を含むファイル名を含むアーカイブの配布を避けることができれば、はるかにうまくいくでしょう.
Windows で UNIX から tar ファイルを解凍するために私が書いた簡単な Python スクリプトを次に示します。
import tarfile
archive_name = "archive_name.tar"
def recover(name):
return unicode(name, 'utf-8')
tar = tarfile.open(name=archive_name, 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()
Linux でデフォルトの tar
を使用する問題 (GNU tar)、解決されました... --format=posix
を追加します ファイル作成時のパラメータ。
例えば:
tar --format=posix -cf
Windows では、ファイルを抽出するために bsdtar を使用します。
https://lists.gnu.org/archive/html/bug-tar/2005-02/msg00018.html に書かれています (2005 以降) !!):
<ブロック引用>
> UTF-8 がサポートされていることについて ChangeLog で読みました。何が
> ということですか?
> 交換可能なアーカイブを作成する方法が見つかりませんでした
> 異なるロケール間。
POSIX.1-2001 形式 (tar --format=posix または --format=pax) でアーカイブを作成する場合、tar はファイル名を現在のロケールから UTF-8 に変換し、アーカイブに保存します。抽出時は逆の操作を行います。
追記--format=posix
と入力する代わりに -H pax
と入力できます 、これは短いです。