在 Debian(以及大多数 Linux 发行版)里,readdir 出现“乱码”通常不是 readdir 本身有 bug,而是字符编码或 locale 不匹配导致的。下面按常见原因给你梳理一下。
Linux 文件名是以字节存储的,readdir 返回的是原始字节串。
如果程序或终端用 UTF-8 解释,而文件名实际是 GBK / ISO-8859-1,就会显示乱码。
locale
常见正常输出(中文环境):
LANG=zh_CN.UTF-8
LC_CTYPE=zh_CN.UTF-8
如果看到:
C
POSIX
那基本就会乱码。
sudo apt install locales
sudo dpkg-reconfigure locales
选中:
zh_CN.UTF-8
en_US.UTF-8
并设为默认。
然后:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
很多旧系统(Windows、老 Linux)用的是:
即使你 locale 是 UTF-8,readdir 读出来也会是“乱码”。
ls | hexdump -C
convmv -f gbk -t utf-8 -r --notest /path
即使系统 locale 正确:
printf 直接输出字节也可能乱码。
struct dirent *de;
while ((de = readdir(dir))) {
printf("%s\n", de->d_name); // 直接打印字节
}
如果终端不是 UTF-8,就会乱。
✅ 确保:
通过以下方式访问的文件:
文件名编码可能:
表现就是 readdir 出来乱码。
mount -t cifs //host/share /mnt -o iocharset=utf8
convmv 修正极少数情况:
也可能导致编码异常。
locale 是否为 UTF-8?如果你愿意,可以:
ls | hexdump 的输出我可以直接帮你判断是哪一种乱码、该怎么改。