温馨提示×

ubuntu readdir支持中文路径吗

小樊
49
2026-09-18 18:28:54
栏目: 智能运维

在 Ubuntu(Linux) 下,readdir(以及底层的 opendir / readdir 系列函数)是支持中文路径的,包括文件夹名、文件名中包含中文(UTF-8 编码)的情况。

下面详细说明一下:


1. 编码才是关键,不是“中文”本身

Linux(包括 Ubuntu)默认使用 UTF-8 编码。

只要:

  • 文件系统里的中文路径是 UTF-8 编码
  • 你的程序用 readdir 读出来的 d_name 也是 UTF-8 字符串

那就完全没问题。


2. readdir 返回的是什么?

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 = "测试目录"

3. 常见误区(容易“以为不支持”)

❌ 用 printf 乱码

printf("%s\n", ent->d_name);

如果终端不是 UTF-8(比如老式 GBK 终端),会显示乱码,但不是 readdir 不支持。

✅ 解决方法:

locale
# 应该是
LANG=zh_CN.UTF-8

❌ 把 d_name 当 ANSI / GBK 处理

如果你在程序里:

  • 用 strlen 判断“字符数”
  • 用非 UTF-8 函数处理字符串

就会出问题。

✅ 正确做法:

  • 使用 mbstowcs / wcstombs
  • 或用 C++ std::string + UTF-8 处理
  • 或用 std::filesystem(C++17)

4. 推荐写法(现代 C++)

#include <filesystem>
namespace fs = std::filesystem;

for (auto& p : fs::directory_iterator("/home/user/测试目录")) {
    std::cout << p.path().string() << std::endl;
}

✅ 自动支持中文路径
✅ 不需要关心 readdir 细节


5. 特殊情况说明

情况 是否支持
ext4 / xfs / btrfs 中文路径 ✅
NTFS(挂载)中文路径 ✅(注意挂载编码)
FAT32(非 UTF-8) ⚠️ 需注意挂载参数
readdir 读中文路径 ✅
程序内部当 GBK 处理 ❌

总结

✅ Ubuntu 的 readdir 完全支持中文路径
✅ 关键是:UTF-8 编码 + 正确字符串处理
❌ 不支持的是“错误编码假设”

如果你愿意,可以贴一段你的 C / C++ 代码,我可以帮你看看是不是编码处理的问题。

0 踩