gpt4 book ai didi

c++ - 通过旧的(非 wchar)API 函数在非 ANSI 系统上打开文件

转载 作者:可可西里 更新时间:2023-11-01 11:14:25 27 4
gpt4 key购买 nike

我正在编写一些让我抓狂的中间件。我正在寻找一些 I18N 专家来帮助我 - 这对我来说都是全新的。

现在这一切都在 Windows 中,但它也必须在 Linux 和 Mac 上运行,尽管我敢打赌它们会很容易。

我有一个系统(我无法触摸),它会给我一个类似于 wchar_t* 的字符串。它接受 UTF-8 或当前语言环境的输入,并神奇地给我一个 wchar_t*。

我有另一个我正在使用的 API,它只能将文件名作为 char*(我也不能触摸)。

所以我一直在做的是在 wchar_t* 中获取我的文件名并使用 Windows API 函数 WideCharToMultiByte 并将其转换为 char* 并将其传递给我的其他 API 函数。它工作得很好,直到 QA 决定使用日语操作系统。现在 fopen(我无法触及的 API 深处)失败了。

我已经尝试在我的 WideCharToMultiByte 调用中同时使用 CP_ACP 和 CP_UTF8,它们都可以在我的开发(美式英语)机器上运行,即使文件名中包含日文字符。但是在日文操作系统上都失败了。

关于我应该如何处理这些文件名的任何提示?

最佳答案

嗯,解决这个问题的正确方法是修复其他 API。只接受狭窄的、非 unicode 文件名是简单的错误行为。

但是……你说你不能那样做。您可以通过获取不包含任何非 ANSI 字符的短文件名并将其传递给损坏的 API 来解决此问题。 (这是因为短文件名是为 16 位应用程序设计的,而 16 位窗口根本不支持 Unicode)

当然,如果文件名不能表示为短文件名,或者目标机器上关闭了短文件名,这当然会失败——但这确实是这里唯一的选择。

编辑:还有一点要注意——如果文件名包含 Unicode,那么短文件名通常是人类不可读的。它将重命名为使用一堆十六进制垃圾,这些垃圾在限制为 8.3 文件名的世界中唯一标识文件。

关于c++ - 通过旧的(非 wchar)API 函数在非 ANSI 系统上打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6351227/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com