温馨提示×

linux readdir支持中文吗

小樊
31
2026-09-17 20:07:06
栏目: 智能运维

简短结论:Linux 的 readdir() 本身是支持中文文件名的,但它不关心“中文”是什么语言,只处理字节序列

下面详细说一下关键点:


1. readdir() 做了什么

readdir()(以及 readdir64() 等)用于读取目录项,返回的结构体(如 struct dirent)里:

char d_name[256];

保存的是文件名对应的字节序列,不是“字符”。


2. 中文文件名在 Linux 上怎么存

Linux 文件系统(ext4、xfs、btrfs 等):

  • 不以语言为单位存储文件名
  • 一般使用 UTF-8 编码的字节序列

例如:

  • 中文“测试” → UTF-8 编码为:
    E6 B5 8B E8 AF 95
    
  • readdir() 返回的就是这串字节

✅ 所以:只要文件系统用的是 UTF-8,中文文件名完全没问题


3. 常见“中文乱码”的原因(不是 readdir 的锅)

乱码通常来自以下情况:

(1)终端 / 程序编码不一致

  • 文件是 UTF-8
  • 终端是 GBK → 显示乱码

(2)挂载参数问题(如 vfat / ntfs)

mount -o iocharset=utf8

如果没设对,中文会乱码

(3)程序误把 d_name 当 ASCII 处理

比如:

  • printf("%s", d_name) 但终端编码不对
  • 用非 UTF-8 的字符串函数截断字节

4. 正确使用的建议

✅ 程序内部统一用 UTF-8
✅ 终端设置为 UTF-8
✅ 跨平台文件系统时指定编码:

mount -t vfat -o utf8,iocharset=utf8 /dev/sdb1 /mnt/usb

5. 示例(C 语言)

#include <dirent.h>
#include <stdio.h>

int main() {
    DIR *dir = opendir(".");
    struct dirent *entry;
    while ((entry = readdir(dir))) {
        printf("%s\n", entry->d_name);
    }
    closedir(dir);
}

只要终端是 UTF-8,中文目录名会正常显示。


总结

Linux 的 readdir() 支持中文文件名,底层是 UTF-8 字节流;是否“看起来正常”,取决于你的编码环境是否一致。

如果你有具体场景(C / C++ / Python / shell / 挂载 U 盘),我可以给你更针对性的建议。

0