希望问题标题能很好地描述我的问题。
平台:OSX 10.8,带有 clang++ 编译器的 llvm
我有一个文件名是日文或西里尔字符的目录。这些文件名ls
在 iTerm2 中使用 en_EN.UTF-8 语言环境和 Monaco 10 字体正确显示(例如 via )(不确定语言环境/字体是否有所不同,但似乎应该如此)。但是,不支持 UTF-8 的 vanilla xterm 会打印乱码或“?” 非 ASCII 字符的字符。
这是实际的问题:
在 C++ 程序中,我使用readdir()
fromdirent.h
列出包含日文或西里尔字符文件名的目录的内容。打印结果的d_name
属性会在 Xcode 终端中显示正确的字符。也就是说,例如,日本汉字真的是这样显示的。从 iTerm2 执行程序时也是如此。同样,非 UFT-8 xterm 中的字符乱码。struct dirent
readdir()
由于日文文件名的字节大小不等于显示的字符数,我大胆假设,这些
dirent.h
函数适用于 UTF-8 字符串。是否有可能所有的 OSX C-Library 都以这种方式工作?因此,例如更改
struct dirent.d_name
orstrcpy
it 并使用更改后的字符串创建新文件是否安全?是否有可能踏入一些导致“??????”的陷阱 文件名被写而不是汉字?设置不同的语言环境,例如“C”,会搞砸(使用时似乎不是这样
setlocale(LC_ALL,"C")
)。
注意:我对 dirent.h 可能的第 3 方替代方案不感兴趣。我编写这个程序只是为了阐明 OSX 如何处理语言环境和字符编码。