Linux から Windowsにファイルを持っていく場合は .tar.gz より .zip の方が便利なので、 Linux 側にある zip コマンドでアーカイブを作りますが、 Linux側の状態によっては Windows側でファイル名が文字化けしたりします。
新しい zip コマンド(3.0以降)、及び Windows 8 以降の.zip解凍機能 (エクスプローラに埋め込みのもの) は、 Unicode でのファイル名の埋め込みに対応しています。 が、圧縮側で Unicodeに対応しきれていないと Windows に持っていったときに 文字化けします。 (2021.11)
$Id$
まずは zip コマンドが UNICODE_SUPPORT つきで コンパイルされていることを確認します。 UNIX系 OS 用の unix/Makefile でデフォルトで有効になっているはずです。
[kabe@centos8 zip-c8]$ zip --version Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license. This is Zip 3.0 (July 5th 2008), by Info-ZIP. Currently maintained by E. Gordon. Please send bug reports to the authors using the web page at www.info-zip.org; see README for details. Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip, as of above date; see http://www.info-zip.org/ for other sites. Compiled with gcc 8.2.1 20180905 (Red Hat 8.2.1-3) for Unix (Linux ELF) on May 11 2019. Zip special compilation options: USE_EF_UT_TIME (store Universal Time) BZIP2_SUPPORT (bzip2 library version 1.0.6, 6-Sept-2010) bzip2 code and library copyright (c) Julian R Seward (See the bzip2 license for terms of use) SYMLINK_SUPPORT (symbolic links supported) LARGE_FILE_SUPPORT (can read and write large files on file system) ZIP64_SUPPORT (use Zip64 to store large files in archives) UNICODE_SUPPORT (store and read UTF-8 Unicode paths) STORE_UNIX_UIDs_GIDs (store UID/GID sizes/values using new extra field) UIDGID_NOT_16BIT (old Unix 16-bit UID/GID extra field not used) [encryption, version 2.91 of 05 Jan 2007] (modified for Zip 3) Encryption notice: The encryption code of this program is not copyrighted and is put in the public domain. It was originally written in Europe and, to the best of our knowledge, can be freely distributed in both source and object forms from any country, including the USA under License Exception TSU of the U.S. Export Administration Regulations (section 740.13(e)) of 6 June 2002. Zip environment options: ZIP: [none] ZIPOPT: [none]
Linux 側で、
strace -o /tmp/trace.out zip -r japanese.zip japanese.dir
などとしてシステムコールをトレースしてみます。
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 ENOENT (そのようなファイルやディレクトリはありません)と、locale-archive ファイルの読み込みに失敗している場合は、 文字コード変換がうまくいかず、.zip ファイルには UTF-8 のファイル名が 生で埋め込まれ、Unicode ファイル名が格納されません。 Windows で解凍すると cp932 で解釈されるので、化けます。
最小インストールでは /usr/lib/locale/locale-archive
が
インストールされていません。
glibc-all-langpacks
パッケージに入っているので、
これを追加でインストールすれば、zip に Unicode ファイル名が埋め込まれて
化けなくなります。
$ sudo dnf install glibc-all-langpacks
Ubuntu系では問題を起こしているという話をあまり聞きませんが、
文字化けしている場合はまず localedef --list
を試してみます。
$ localedef --list en_US.utf8 ja_JP ja_JP.eucjp ja_JP.ujis ja_JP.utf8 japanese japanese.eucLANG 環境変数に設定されている値 (en_US.UTF-8 とか ja_JP.utf8) が 含まれていれば問題ありませんが、 無い場合は
/etc/locale.gen
の ja_JP.UTF-8 UTF-8
項
のコメントを外し、
sudo locale-gen
します。
直接的な方法はないのですが、
zipinfo -U
で日本語がエスケープされる .zip は
正しく Unicode 文字が埋め込まれています。
$ zipinfo -U j-nou8.zip Archive: j-nou8.zip Zip file size: 364 bytes, number of entries: 2 drwxr-xr-x 3.0 unx 0 bx stor 21-Oct-26 21:49 japanese.d/ -rw-r--r-- 3.0 unx 16 tx stor 21-Oct-26 21:49 japanese.d/日本語.txt <<< 日本語ファイル名が生のまま出てくる 2 files, 16 bytes uncompressed, 16 bytes compressed: 0.0%
$ zipinfo -U j-u8.zip Archive: j-u8.zip Zip file size: 364 bytes, number of entries: 2 drwxr-xr-x 3.0 unx 0 bx stor 21-Oct-26 21:49 japanese.d/ -rw-r--r-- 3.0 unx 16 tx stor 21-Oct-26 21:49 japanese.d/#U65e5#U672c#U8a9e.txt <<< 日本語ファイルがエスケープされる 2 files, 16 bytes uncompressed, 16 bytes compressed: 0.0%