WSL2 で作った ZIP ファイルを Windows で解凍すると、日本語ファイル名が文字化けする。今時の環境で、ファイル名が UTF-8 対応されないのはおかしい。ファイルの中を調べると、UTF-8 encoding bit が立っていない。
- Linux で作った zip アーカイブのファイル名が、Windowsで文字化けする
Linux では locale が正しく設定されていないと駄目らしい。ただ、locale は正しいように見える。
$ uname -a
Linux MY-PC 5.15.167.4-microsoft-standard-WSL2 #1 SMP Tue Nov 5 00:21:55 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
$ echo $LANG
C.UTF-8
$ grep '^[^#]' /etc/locale.gen
C.UTF-8 UTF-8
$ localedef --list-archive
C.utf8
$ locale -a
C
C.utf8
POSIX
仕方がないので strace してみる。
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=1535520, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 1535520, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe88cb9a000
close(3) = 0
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=2996, ...}, AT_EMPTY_PATH) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2996
read(3, "", 4096) = 0
close(3) = 0
openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/en_US/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/en.UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/en.utf8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/en/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
C.UTF-8 なのに en_US を見に行ってるっぽい。試しに en_US.UTF-8 を入れてみると、正しく UTF-8 encoding されるようになった。これが仕様なのか不具合なのかは知らない。
$ echo $LANG
C.UTF-8
$ grep '^[^#]' /etc/locale.gen
C.UTF-8 UTF-8
en_US.UTF-8 UTF-8
$ localedef --list-archive
C.utf8
en_US.utf8
$ locale -a
C
C.utf8
POSIX
en_US.utf8