在 Debian(以及一般 Linux 系统)上,readdir 本身并不关心文件名是中文还是英文,它只按照字节序列来读取目录项。中文文件名是否能“正常处理”,取决于下面几个因素:
#include <dirent.h>
struct dirent *entry;
DIR *dir = opendir(path);
while ((entry = readdir(dir)) != NULL) {
// entry->d_name 是 UTF-8 编码的字节串(通常)
}
readdir 返回的是原始字节✅ 结论:
readdir 能正常读取中文,只是你拿到的是 UTF-8 字符串
Debian 现代版本:
UTF-8CC.UTF-8zh_CN.UTF-8查看当前编码:
locale
如果看到:
LANG=C
那么:
✅ 推荐设置:
export LANG=zh_CN.UTF-8
# 或
export LANG=C.UTF-8
现象:
解决:
echo $TERM
locale
确保终端使用 UTF-8
例如:
strlen(entry->d_name) // 按字节
中文一个字可能 3 字节
✅ 应使用:
mbstowcs例如:
此时:
readdir 返回的是 GBK 字节iconv)#include <dirent.h>
#include <stdio.h>
int main() {
DIR *d = opendir(".");
struct dirent *e;
while ((e = readdir(d))) {
printf("%s\n", e->d_name); // UTF-8 直接输出
}
closedir(d);
}
编译运行(终端 UTF-8):
gcc test.c -o test
./test
readdir:glibc 封装readdir64:大文件系统getdents:底层系统调用他们都不处理编码
| 项目 | 说明 |
|---|---|
| readdir 是否支持中文 | ✅ 支持 |
| 是否自动编码转换 | ❌ 不转换 |
| Debian 默认 | UTF-8 |
| 常见问题 | 终端 / locale / 编码不一致 |
| 解决方案 | 使用 UTF-8 + 正确 locale |
如果你有:
我可以给你更针对性的建议。