在 Debian(Linux) 下,readdir 处理中文文件名本身不需要特殊处理,只要编码一致即可。常见问题和解决方法如下:
✅ Linux 文件名本质是字节序列,不是字符
✅ 只要文件名是 UTF‑8 编码,readdir 就能正确读取
✅ 问题通常出在:终端、程序、locale 编码不一致
locale
推荐看到类似:
LANG=zh_CN.UTF-8
LC_CTYPE=UTF-8
sudo dpkg-reconfigure locales
勾选:
zh_CN.UTF-8
en_US.UTF-8
然后:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
#define _GNU_SOURCE
#include <stdio.h>
#include <dirent.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, ""); // 关键:启用本地编码
DIR *dir = opendir(".");
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
return 0;
}
✅ setlocale(LC_ALL, "") 很重要
✅ entry->d_name 是 UTF‑8 字符串
原因
setlocale✅ 解决:
file 文件名
如果是 GBK,转换:
convmv -f gbk -t utf8 --notest 文件名
原因
ls 使用 locale✅ 解决:
setlocale(LC_ALL, "");
✅ 本质一样:
-Dfile.encoding=UTF-8| 项目 | 要求 |
|---|---|
| 文件系统 | UTF‑8 |
| locale | *.UTF-8 |
| readdir | 不需要特殊处理 |
| 终端 | UTF‑8 |
| Windows 文件 | 可能需要 convmv |
Debian 下 readdir 处理中文 = 保证 UTF‑8 + 设置 locale,不需要额外代码。
如果你愿意,可以把:
发出来,我可以帮你精确定位问题。