在 Ubuntu(Linux)下用 readdir 读取中文文件名,核心不是 readdir 本身,而是字符编码。只要搞清编码,中文完全没问题。
✅ Linux 文件名以字节存储,默认是 UTF-8
✅ readdir 返回的是 char *(字节串)
✅ 中文文件名 = UTF-8 编码的字节序列
❌ 不要当成 GBK / ANSI 处理
❌ 不要假设“一个字符 = 一个字节”
#include <dirent.h>
#include <stdio.h>
int main() {
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
✅ 如果终端是 UTF-8(Ubuntu 默认),中文文件名会正常显示
原因:终端不是 UTF-8
解决:
locale
应为:
LANG=zh_CN.UTF-8
设置:
export LANG=zh_CN.UTF-8
wchar_t / std::wstring(C++)Linux 不推荐用 wchar_t 处理文件名
✅ 正确方式:
std::string#include <dirent.h>
#include <string>
void list_dir(const std::string& path) {
DIR* dir = opendir(path.c_str());
dirent* e;
while ((e = readdir(dir))) {
std::string name = e->d_name; // UTF-8
}
}
中文在 UTF-8 中占 3 字节
✅ 用 utf8 处理函数,例如:
#include <uchar.h>
size_t utf8_len(const char *s) {
size_t len = 0;
while (*s) {
if ((*s & 0xC0) != 0x80) len++;
s++;
}
return len;
}
普通 strcmp 是按字节排(不对)
解决:
export LC_COLLATE=zh_CN.UTF-8
或用 strcoll
readdir = readdir64Ubuntu 下 readdir 处理中文 = 使用 UTF-8,不要转码,不要拆字节
如果你愿意,可以告诉我:
我可以直接给你完整示例。