在 Ubuntu(Linux)下使用 readdir 读取目录时出现“乱码”,通常不是 readdir 本身的问题,而是编码不一致或使用方式不当导致的。下面按常见原因逐条说明。
????、方块、奇怪字符ls 正常,但程序里乱码Linux 默认使用 UTF-8 编码文件名,但如果:
那么 readdir 返回的 d_name 就是 非 UTF-8 字节流,直接当 UTF-8 打印就会乱码。
locale
file 某个文件
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
#include <iconv.h>
// GBK -> UTF-8
readdir 没问题,但 printf 出来乱码ls 也乱码终端设置为 UTF-8:
locale
确保不是 C 或 POSIX
wprintf(L"%s", ent->d_name); // 错
printf("%s\n", ent->d_name);
d_name 是 char*,不是 wchar_t*
mount -o iocharset=utf8 /dev/sdb1 /mnt
或 /etc/fstab:
/dev/sdb1 /mnt vfat iocharset=utf8 0 0
readdir 不会解码文件名,它返回的是:
文件系统在磁盘上存储的原始字节
所以:
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
struct dirent *ent;
while ((ent = readdir(dir))) {
printf("%s\n", ent->d_name);
}
closedir(dir);
}
只要:
✅ locale 是 UTF-8
✅ 终端编码 UTF-8
✅ 文件名是 UTF-8
✅ 没用 wchar 错误打印
✅ 非 Windows 文件系统未错挂
如果你愿意,可以贴:
locale 输出我可以直接帮你定位是哪一层出的问题。