c++ - Windows 使用带有 UTF-16 的 char * 函数

标签 c++ windows encoding

我将一个应用程序从 Linux 移植到 Windows。 在 Linux 上我使用 libmagic在 Windows 上我不乐意从中删除的库。
问题是我需要将以 UTF-16 编码保存的文件名传递给这样的函数:

int magic_load(magic_t cookie, const char *filename);

不幸的是,它只接受 const char *filename。我的第一个想法是将 UTF-16 字符串转换为本地编码,但存在一些问题 - 比如字符串可以包含例如中文符号和本地编码可能是俄语。
结果我们将在输出中得到垃圾,程序将无法达到其目标。
转换为 UTF-8 也无济于事,因为这是 Windows,Windows 以 UTF-16 格式保存文件名。

但我不知何故需要使该函数能够打开具有 Unicode 名称的文件。

我只得出一个非常非常糟糕的解决方案:

 1. I have a filename
 2. I can copy file with unicode name to file with ASCII name like "1.mp3"
 3. open it with libmagic functions and get what I want
 4. remove temporarily file 

但我知道这个解决方案有多么糟糕以及它如何使我的应用程序变慢,所以我想知道,也许有更好的方法来做到这一点?

提前感谢任何提示,因为我真的很困惑。

最佳答案

使用 8.3 文件名访问文件。

除了长度最多为 255 个字符的长文件名外,Windows 还会生成 8.3 格式的 MS-DOS 兼容(短)文件名。

http://support.microsoft.com/kb/142982

关于c++ - Windows 使用带有 UTF-16 的 char * 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14698275/

相关文章:

windows - Vim:更改启动目录?

windows - 是否可以在浏览器中运行 EXE?

iphone - 使用 writeToFile :atomically:encoding:error: vs. createFileAtPath:contents:attributes: 时的不同编码结果:

c# - 在 Windows Phone 上检测流或字节数组编码

c++ - 如何使用 std::auto_ptr 作为函数的参数?

c++ - 在 Windows 上使用 C++ 删除文件

c++ - 确定确切的头文件

xml - 当 matlab 中的 XML 文件内存在一些特殊的 UTF-8 字符时如何处理

c++ - ATMega328p : Strange behaviour sending bytes through USART

c++ - 如何从 QML 更改 C++ 模型?