简短结论:Linux 的 readdir() 本身是支持中文文件名的,但它不关心“中文”是什么语言,只处理字节序列。
下面详细说一下关键点:
readdir() 做了什么readdir()(以及 readdir64() 等)用于读取目录项,返回的结构体(如 struct dirent)里:
char d_name[256];
保存的是文件名对应的字节序列,不是“字符”。
Linux 文件系统(ext4、xfs、btrfs 等):
例如:
E6 B5 8B E8 AF 95
readdir() 返回的就是这串字节✅ 所以:只要文件系统用的是 UTF-8,中文文件名完全没问题
乱码通常来自以下情况:
mount -o iocharset=utf8
如果没设对,中文会乱码
d_name 当 ASCII 处理比如:
printf("%s", d_name) 但终端编码不对✅ 程序内部统一用 UTF-8
✅ 终端设置为 UTF-8
✅ 跨平台文件系统时指定编码:
mount -t vfat -o utf8,iocharset=utf8 /dev/sdb1 /mnt/usb
#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,中文目录名会正常显示。
Linux 的
readdir()支持中文文件名,底层是 UTF-8 字节流;是否“看起来正常”,取决于你的编码环境是否一致。
如果你有具体场景(C / C++ / Python / shell / 挂载 U 盘),我可以给你更针对性的建议。