在 Ubuntu(Linux) 下,readdir(以及底层的 opendir / readdir 系列函数)是支持中文路径的,包括文件夹名、文件名中包含中文(UTF-8 编码)的情况。
下面详细说明一下:
Linux(包括 Ubuntu)默认使用 UTF-8 编码。
只要:
readdir 读出来的 d_name 也是 UTF-8 字符串那就完全没问题。
struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_rename;
unsigned char d_type;
char d_name[256];
};
d_name 是 以 UTF-8 编码的字节序列d_name 中就是正常的多字节 UTF-8 字符例如:
目录:/home/user/测试目录
readdir 返回的 d_name = "测试目录"
printf 乱码printf("%s\n", ent->d_name);
如果终端不是 UTF-8(比如老式 GBK 终端),会显示乱码,但不是 readdir 不支持。
✅ 解决方法:
locale
# 应该是
LANG=zh_CN.UTF-8
如果你在程序里:
strlen 判断“字符数”就会出问题。
✅ 正确做法:
mbstowcs / wcstombsstd::string + UTF-8 处理std::filesystem(C++17)#include <filesystem>
namespace fs = std::filesystem;
for (auto& p : fs::directory_iterator("/home/user/测试目录")) {
std::cout << p.path().string() << std::endl;
}
✅ 自动支持中文路径
✅ 不需要关心 readdir 细节
| 情况 | 是否支持 |
|---|---|
| ext4 / xfs / btrfs 中文路径 | ✅ |
| NTFS(挂载)中文路径 | ✅(注意挂载编码) |
| FAT32(非 UTF-8) | ⚠️ 需注意挂载参数 |
| readdir 读中文路径 | ✅ |
| 程序内部当 GBK 处理 | ❌ |
✅ Ubuntu 的 readdir 完全支持中文路径
✅ 关键是:UTF-8 编码 + 正确字符串处理
❌ 不支持的是“错误编码假设”
如果你愿意,可以贴一段你的 C / C++ 代码,我可以帮你看看是不是编码处理的问题。