在 Linux 下使用 readdir() 读取目录时出现“乱码”,通常不是 readdir() 本身的问题,而是编码不一致或显示方式不对导致的。下面按常见原因逐一说明。
Linux 文件系统本身不关心编码,文件名只是字节序列。
如果文件名是以 GBK / GB2312 / ISO-8859-1 等编码保存的,而你的:
就会出现乱码。
✅ 表现:
printf("%s\n", dirent->d_name); // 乱码
✅ 解决思路:
iconv 转换编码后再显示示例(GBK → UTF-8):
iconv_t cd = iconv_open("UTF-8", "GBK");
iconv(cd, &in, &inlen, &out, &outlen);
如果系统 locale 是:
LANG=C
那么:
✅ 检查:
locale
✅ 推荐设置:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
即使程序和文件都是 UTF-8,如果:
也会看起来像乱码。
✅ 检查终端设置:
dirent->d_name 是:
char d_name[256]; // 原始字节
如果你:
wchar_t也会乱码。
✅ 正确方式(UTF-8 环境):
printf("%s\n", entry->d_name);
NTFS / FAT 在 Linux 下挂载时:
iocharset=iso8859-1✅ 正确挂载方式:
mount -o iocharset=utf8 /dev/sdb1 /mnt
或 /etc/fstab:
/dev/sdb1 /mnt ntfs-3g defaults,iocharset=utf8 0 0
极少数情况:
✅ 可用:
convmv -f gbk -t utf8 -r --notest /path
locale 是否是 UTF-8?printf("%s", d_name)?如果你愿意,可以把:
readdir 示例代码locale 输出发出来,我可以精确判断是哪一种乱码。