在 Debian(以及其他 Linux 发行版)下,readdir 出现“乱码”通常不是 readdir 本身的问题,而是字符编码不一致或终端/程序未正确处理文件名编码导致的。下面分点说明原因和解决办法。
很多老系统、U 盘、Windows 文件,文件名可能是 GBK 编码。
而 Debian 默认使用 UTF-8,readdir 返回的是“原始字节”,如果你的程序或终端按 UTF-8 解释,就会乱码。
验证:
locale
如果看到:
LANG=zh_CN.UTF-8
但文件名是 GBK,就会乱码。
解决:
convmv -f gbk -t utf-8 -r --notest /path
iconv 转换即使文件是 UTF-8,如果:
也会显示乱码。
检查终端编码:
echo $LANG
应为类似:
zh_CN.UTF-8
解决:
readdir() 返回的是:
struct dirent {
char d_name[256]; // 原始字节,不一定是“字符串”
};
示例(错误假设):
printf("%s\n", ent->d_name); // 如果终端不是 UTF-8 → 乱码
如果:
locale
出现:
locale: Cannot set LC_CTYPE to default locale
说明 locale 没生成。
解决:
sudo dpkg-reconfigure locales
勾选:
zh_CN.UTF-8
en_US.UTF-8
然后:
export LANG=zh_CN.UTF-8
例如:
mount -t vfat /dev/sdb1 /mnt
默认可能用 iso8859-1
正确方式:
mount -o iocharset=utf8 /dev/sdb1 /mnt
或 NTFS:
mount -t ntfs-3g -o utf8 /dev/sdb1 /mnt
ls | hexdump -C
如果你看到:
c4 e3 ba c3 # GBK
e4 bd a0 e5 a5 bd # UTF-8
✅ Debian 下统一使用 UTF-8
✅ 文件名尽量使用 UTF-8
✅ 程序中把 d_name 当“字节流”处理
✅ 显示前确保终端 & locale 一致
如果你愿意,可以贴一段:
readdir 的 C 代码ls 输出 + locale我可以帮你精确判断是哪一种乱码。