c++ - 如何防止非 Unicode 应用程序在将资源加载到不同本地化的机器上时转换资源的字符集?

标签 c++ windows localization character-encoding codepages

我们有一个非 Unicode、C++ 应用程序,它是用 Visual Studio 编写的,最初是为使用代码页 1252 字符集的机器编写的。

我们的应用程序在读取资源内容后对其执行许多后处理步骤,包括在某些文件中查找资源字符串。

现在中国人开始使用该应用程序,他们的机器使用 PRC 语言环境(它将非 unicode 应用程序的默认代码页设置为 936,这是一个多字节字符集)。

看起来 CString::LoadString 将执行一些转换。这会中断进一步的处理,因为我们在其他文件中查找的内容不同。

CMenu::GetMenuStringCWnd::GetWindowText 也是如此。

糟糕的是,我们不能简单地在我们的文件上使用 iconv,因为 LoadStringGetMenuStringGetWindowText 会起作用这样:

  • 一些在代码页 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/

相关文章:

ruby - 如何判断是否支持 File.symlink

c# - 如何检查给定的字符串在 Windows 下是否是合法/有效的文件名?

android - 不同语言的 Google Play 应用说明

vb.net - 基本本地化(中性语言)

c# - 用户消息的复数性

c++ - 使用 C++ 在 Qt Creator 中创建 QLabel 的子类

python - 如何在python for循环中用变量控制增量

c# - 使用 docker 容器化 .net c# WPF 应用程序

c++ - 如果推导其中一个模板参数,是否可以不指定所有模板参数?

c++ - cURL交叉编译