温馨提示×

ubuntu readdir怎么处理中文

小樊
54
2026-09-21 20:44:08
栏目: 智能运维

在 Ubuntu(Linux)下用 readdir 读取中文文件名,核心不是 readdir 本身,而是字符编码。只要搞清编码,中文完全没问题。


一、关键结论(先看这个)

✅ Linux 文件名以字节存储,默认是 UTF-8
✅ readdir 返回的是 char *(字节串)
✅ 中文文件名 = UTF-8 编码的字节序列
❌ 不要当成 GBK / ANSI 处理
❌ 不要假设“一个字符 = 一个字节”


二、readdir 基本用法(支持中文)

#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 默认),中文文件名会正常显示


三、常见坑 & 解决方案

1️⃣ 终端乱码

原因:终端不是 UTF-8

解决:

locale

应为:

LANG=zh_CN.UTF-8

设置:

export LANG=zh_CN.UTF-8

2️⃣ 想用 wchar_t / std::wstring(C++)

Linux 不推荐用 wchar_t 处理文件名

✅ 正确方式:

  • 用 std::string
  • 内部统一 UTF-8
#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
    }
}

3️⃣ 需要“字符数”而不是“字节数”

中文在 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;
}

4️⃣ 排序中文(按拼音)

普通 strcmp 是按字节排(不对)

解决:

export LC_COLLATE=zh_CN.UTF-8

或用 strcoll


四、进阶:readdir vs readdir64

  • 现代 Ubuntu 默认 readdir = readdir64
  • 支持大目录、长文件名
  • 中文无影响

五、总结一句话

Ubuntu 下 readdir 处理中文 = 使用 UTF-8,不要转码,不要拆字节

如果你愿意,可以告诉我:

  • C 还是 C++?
  • 是否要递归遍历?
  • 是否要排序 / 过滤中文?

我可以直接给你完整示例。

0 踩