我们有一个使用 Visual Studio 编写的非 Unicode C++ 应用程序,它最初是为使用代码页 1252 字符集的机器编写的。
我们的应用程序在读取资源内容后执行许多后处理步骤,包括在某些文件中查找资源字符串。
现在中国的人们开始使用该应用程序,他们的机器使用 PRC 语言环境(将非 unicode 应用程序的默认代码页设置为 936,这是一个多字节字符集)。
似乎CString::LoadString
将执行一些转换。这会中断进一步处理,因为我们在其他文件中查找的内容不同。
CMenu::GetMenuString
或也是如此CWnd::GetWindowText
。
糟糕的是,我们不能简单地iconv
在我们的文件上使用,因为LoadString
, GetMenuString
orGetWindowText
会这样:
- 某些在代码页 1252 中有效的字符在代码页 936 中无效(例如î、û、ñ、–)并被替换为问号
- 某些在代码页 1252 中有效的字符在代码页 936 中无效(例如É),但被替换为替代字符(É => é)
- 两个代码页中都存在一些字符,但表示方式不同,在 CP936 中通常有两个字节
- 两个代码页中的某些字符(包括所有 ASCII 字符)匹配。
我希望加载资源内容的这三个函数加载二进制内容,而不执行任何字符集转换。我试图修改.rc
文件,LANGUAGE LANG_INVARIANT, SUBLANG_NEUTRAL
但这并没有改变任何东西。
资源文件还包括一个#pragma code_page(1252)
; 可以安全删除吗?那个 pragma 是干什么用的?
谢谢您的回答。