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