▼Linux で作った zip アーカイブのファイル名が、Windowsで文字化けする▼

Linux から Windowsにファイルを持っていく場合は .tar.gz より .zip の方が便利なので、 Linux 側にある zip コマンドでアーカイブを作りますが、 Linux側の状態によっては Windows側でファイル名が文字化けしたりします。

新しい zip コマンド(3.0以降)、及び Windows 8 以降の.zip解凍機能 (エクスプローラに埋め込みのもの) は、 Unicode でのファイル名の埋め込みに対応しています。 が、圧縮側で Unicodeに対応しきれていないと Windows に持っていったときに 文字化けします。 (2021.11)

[Windowsで解凍すると文字化けしている]

$Id$


▼文字化けする場合のデバッグ

▼zip コマンドの Unicode サポート確認

まずは 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 で解釈されるので、化けます。

▼解決法

▼RHEL/CentOS/AlmaLinux/Rocky/Navy系の場合

最小インストールでは /usr/lib/locale/locale-archive が インストールされていません。 glibc-all-langpacks パッケージに入っているので、 これを追加でインストールすれば、zip に Unicode ファイル名が埋め込まれて 化けなくなります。

$ sudo dnf install glibc-all-langpacks

▼Ubuntu系の場合

Ubuntu系では問題を起こしているという話をあまり聞きませんが、 文字化けしている場合はまず localedef --list を試してみます。

$ localedef --list
en_US.utf8
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
LANG 環境変数に設定されている値 (en_US.UTF-8 とか ja_JP.utf8) が 含まれていれば問題ありませんが、 無い場合は /etc/locale.genja_JP.UTF-8 UTF-8 項 のコメントを外し、 sudo locale-gen します。

▼.zipファイルに Unicode ファイル情報が含まれているかをLinux上で確認

直接的な方法はないのですが、 zipinfo -U で日本語がエスケープされる .zip は 正しく Unicode 文字が埋め込まれています。

・Unicode情報が埋まっていない.zip (×)
$ 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%
・Unicode情報が正常に埋まっている.zip (○)
$ 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%

[Windows で化けていない.zip]


kabe.sra-tohoku.co.jp