CString资源显示为ANSI

时间:2019-03-01 19:06:41

标签: c++ string winapi resources

问题

我已经将一些资源文件翻译成几种语言,并且发现某些字符在UI中无法正确显示。

例如:Versión:显示为Versión:。我已经确保我拥有UNICODE_UNICODE指令,从我阅读的所有内容来看,它们应该能够按预期工作。可能是什么原因造成的?

代码

正在被调用的代码(并且我确实验证了它已到达此方法):

static HINSTANCE _languageDll = NULL; //Setup in another function call

CString GetLangString(int resourceId)
{
    CString langString;

    langString.LoadString(_languageDll, resourceId);

    return langString;
}

检查langString可以看到它正在加载Versión:

要查看是否为显示问题,我尝试了以下类似操作,并且显示正确:

return CString("Versión:");

浏览代码,我发现 WinUser.h 中有一个名为LoadString的定义,它基于{{1}在LoadStringWLoadStringA之间切换}指令。经过一番Google-fu之后,我没有运气尝试了以下方法:

UNICODE

我没有让它返回,看着调试器,我可以看到它再次加载了CString GetLangString(int resourceId) { WCHAR buffer[256]; LoadString(_languageDll, resourceId, buffer, sizeof(buffer)/sizeof(WCHAR)); return CString(buffer); }

我完全不知道为什么会这样。资源文件可能有问题吗?我只是想学习C ++,所以我的技能会更好(又称“我是菜鸟”),因此对此提供的任何帮助将不胜感激。

注意:我要接管由别人建造的项目,所以我不知道为什么使用某些功能的原因。

编辑1

原始RC文件中的字符串如下:

Versión:

在翻译后的RC文件中:

STRINGTABLE
BEGIN
    IDS_STRING703           "Version: %d.%d.%d.%d"
END

1 个答案:

答案 0 :(得分:0)

确保保存资源文件utf-16格式,而不是ANSI。 您可以参考此answer来了解格式差异。