在 CentOS 下使用 readdir() 读取目录时出现乱码,通常不是 glibc 的 bug,而是编码不一致导致的。下面按最常见原因给你排查思路。
CentOS 7/8 默认使用 UTF-8,但如果你:
就容易出现乱码。
locale
典型正常输出:
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
如果不是 UTF-8,建议改为:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
例如:
这些文件名在 UTF-8 终端下就会显示乱码。
ls | hexdump -C
如果你看到类似:
c4 e3 ba c3
是 GBK,而不是 UTF-8。
readdir() 返回的是 原始字节序列printfprintf("%s\n", dirent->d_name);
如果:
就可能乱码。
ls -lh
如果 ls 也乱码 → 系统/终端编码问题
如果 ls 正常 → 程序处理问题
python3 -c "import os; print(os.listdir('.'))"
Python 会直接显示字节,更容易判断编码。
localectl set-locale LANG=en_US.UTF-8
或临时:
export LANG=en_US.UTF-8
convmv -f gbk -t utf-8 -r --notest .
⚠️ 转换前先备份
std::string name = dirent->d_name; // 当 bytes 看待
不要假设它是 ASCII 或本地编码。
CentOS 的 readdir 不乱码,乱的是“编码不一致”
如果你愿意,可以把下面信息发我,我可以精确判断:
locale 输出我可以直接帮你定位到“哪一步在乱”。