在 Linux 下使用 readdir(通常指 readdir() / readdir_r(),属于 POSIX dirent.h)处理中文路径时,核心原则是:
Linux 下文件名是以字节串(UTF-8 编码)存储的,不要当成 C 的
char*字符串逻辑去“解释”,直接当字节处理即可。
下面按常见问题和正确做法说明。
readdir 本身“天然支持”中文readdir 返回的结构体:
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_revent;
unsigned char d_type;
char d_name[]; // 文件名(字节序列)
};
✅ 中文路径不需要特殊 API
只要:
zh_CN.UTF-8)那么 d_name 中就是正常的 UTF-8 字节流。
#include <stdio.h>
#include <dirent.h>
#include <string.h>
int main() {
DIR *dir = opendir("/中文目录");
if (!dir) {
perror("opendir");
return 1;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name); // UTF-8 直接输出
}
closedir(dir);
return 0;
}
✅ 编译运行即可正常显示中文(终端需支持 UTF-8)
strlen / strcpy 当“字符数”处理UTF-8 中文是 多字节:
strlen("中文"); // = 6,不是 2
✅ 正确方式:
mbstowcschar name[10];
strncpy(name, entry->d_name, 10); // 可能截断 UTF-8 字符
✅ 正确方式:
如果终端乱码:
#include <locale.h>
setlocale(LC_ALL, "");
建议程序开始时调用。
snprintf)char path[1024];
snprintf(path, sizeof(path), "%s/%s", dirname, entry->d_name);
open / stat 操作中文文件直接使用 entry->d_name 即可:
stat(path, &st);
Linux 内核不关心“是不是中文”,只看字节。
使用:
mbrtowc<wchar.h>⚠️ 一般没必要
Linux 下
readdir处理中文路径:不要“处理”,直接当 UTF-8 字节串用。
如果你有具体场景(比如:
可以告诉我,我可以给你更针对性的方案。