2025-04-27

UTF-8 filename ZIP on Linux

WSL2 で作った ZIP ファイルを Windows で解凍すると、日本語ファイル名が文字化けする。今時の環境で、ファイル名が UTF-8 対応されないのはおかしい。ファイルの中を調べると、UTF-8 encoding bit が立っていない。

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

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。