简短结论先给出:CentOS 上的 readdir()(以及 opendir()/readdir() 系列函数)本身是“支持中文的”,但前提是文件系统的编码、Locale 设置、应用程序处理方式三者一致,通常都使用 UTF‑8。
下面详细说一下。
readdir() 本身并不关心“中文”readdir() 只是读取目录项里的原始字节流(filename 是 char*):
struct dirent {
char d_name[256];
};
d_name 就是 UTF‑8d_name 就是 GBK所以:
✅
readdir()能“读到”中文文件名
❌ 它不保证你“看得懂”或“显示正常”
默认 locale 通常是:
LANG=zh_CN.UTF-8
只要:
d_name✅ 中文目录、中文文件名完全正常
如果:
LANG=CLANG=zh_CN.GBK而文件名是 UTF‑8,就会:
locale
如果不是 UTF-8,建议:
export LANG=zh_CN.UTF-8
readdir() 读出来是 GBK 字节解决:
convmv 转换文件名convmv -f gbk -t utf8 -r --notest /path
例如:
strlen() 当字符数应:
mbstowcs#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir))) {
printf("%s\n", entry->d_name);
}
closedir(dir);
}
只要终端是 UTF‑8,中文会正常显示。
CentOS 的
readdir()支持中文,但“支持”的是 UTF‑8 编码的中文,而不是自动处理编码问题。
如果你愿意,可以告诉我:
我可以帮你精准定位问题。