c++ - 如何在 Linux 中打开包含非 Ascii 字符串的 wchar_t* 文件?

标签 c++ c linux file wchar

环境:Gcc/G++ Linux

我在文件系统中有一个非 ASCII 文件,我要打开它。

现在我有一个wchar_t*,但我不知道如何打开它。 (我信任的 fopen 只打开 char* 文件)

请帮忙。非常感谢。

最佳答案

有两种可能的答案:

如果您想确保所有 Unicode 文件名都可表示,您可以硬编码文件系统使用 UTF-8 文件名的假设。这是“现代”Linux 桌面应用程序方法。只需将字符串从 wchar_t (UTF-32) 转换为带有库函数的 UTF-8(iconv 可以很好地工作)或您自己的实现(但要查找规范,这样您就不会不要像 Shelwien 那样把它搞得一团糟),然后使用 fopen

如果你想以更面向标准的方式做事,你应该使用 wcsrtombswchar_t 字符串转换为多字节 char在语言环境编码中的字符串(希望在任何现代系统上无论如何都是 UTF-8)并使用 fopen。请注意,这需要您事先使用 setlocale(LC_CTYPE, "")setlocale(LC_ALL, "") 设置语言环境。

最后,不完全是答案而是建议:

将文件名存储为 wchar_t 字符串可能是一个可怕的错误。您应该将文件名存储为抽象字节字符串,并且只将它们及时转换为 wchar_t 以便在用户界面中显示它们(如果有必要的话;许多 UI 工具包使用纯字节字符串他们自己并为你做角色的解释)。通过这种方式,您可以消除许多可能的讨厌的极端情况,并且您永远不会遇到某些文件因其名称而无法访问的情况。

关于c++ - 如何在 Linux 中打开包含非 Ascii 字符串的 wchar_t* 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4676327/

相关文章:

linux - 如何在没有到达 while 语句时运行脚本

linux - 我可以从 Nagios-Plugins 包中编译单个 .c 文件吗?

c++ - stub 在可执行文件中

c++ - 用特征计算两条线的交点

c++ - 生成一个新终端并打开 vim

c++ - 如何知道该包包含哪些功能?

linux - BASH 错误, "source"附近的意外标记

C++动态加载类: Why is a "destroy" function needed?

c++ - 一个奇怪的 C++ 错误 : test. cpp:15:错误:将 ‘const *’ 作为 ‘this’ 的 ‘*’ 参数传递会丢弃限定符

c - 将字符串扩展为关键字