我们有一个非 Unicode、C++ 应用程序,它是用 Visual Studio 编写的,最初是为使用代码页 1252 字符集的机器编写的。
我们的应用程序在读取资源内容后对其执行许多后处理步骤,包括在某些文件中查找资源字符串。
现在中国人开始使用该应用程序,他们的机器使用 PRC 语言环境(它将非 unicode 应用程序的默认代码页设置为 936,这是一个多字节字符集)。
看起来 CString::LoadString
将执行一些转换。这会中断进一步的处理,因为我们在其他文件中查找的内容不同。
CMenu::GetMenuString
或 CWnd::GetWindowText
也是如此。
糟糕的是,我们不能简单地在我们的文件上使用 iconv
,因为 LoadString
、GetMenuString
或 GetWindowText
会起作用这样:
- 一些在代码页 1252 中有效的字符在代码页 936 中无效(例如 î、û、ñ、œ)并被替换为问号
- 某些在代码页 1252 中有效的字符在代码页 936 中无效(例如 É),但会被替代字符替换(É => é)
- 一些字符在两个代码页中都存在但表示方式不同,在 CP936 中通常为两个字节
- 某些字符(包括所有 ASCII 字符)在两个代码页中都匹配。
我希望这三个加载资源内容的函数加载二进制内容,而不执行任何字符集转换。我尝试用 LANGUAGE LANG_INVARIANT, SUBLANG_NEUTRAL
修改 .rc
文件,但这并没有改变任何东西。
资源文件还包括一个#pragma code_page(1252)
;这可以安全地删除吗?这个 pragma 有什么用?
感谢您的回答。
最佳答案
也许你可以使用 BOOL SetThreadLocale( LCID Locale );
MSDN: SetThreadLocale 通过 LANGUAGE 语句影响资源的选择。该语句影响诸如 CreateDialog、DialogBox、LoadMenu、LoadString 和 FindResource 等函数。它设置 CP_THREAD_ACP 隐含的代码页,但不影响 FindResourceEx。有关详细信息,请参阅代码页标识符。
关于c++ - 如何防止非 Unicode 应用程序在将资源加载到不同本地化的机器上时转换资源的字符集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5154319/