关于wxWidgets控件出现乱码

旧街凉风 提交于 2021-02-15 09:36:45

这两天在用wxWidgets做一个小程序,突然遇到了一个控件显示出现乱码的问题。

首先声明:我用的编译器是Visual Studio 2005,wxWidgets版本是2.8.12,下面的解决方法不一定对所有的平台都有效。

我们知道,wxWidgets中控件显示字符串一般都是用wxString,例如下面的一小段代码创建并显示一个按钮:

// 创建一个按钮,显示名称就是“按钮”
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxT("按钮"), wxDefaultPosition, wxDefaultSize, 0);
// 把这个按钮放在一个BoxSizer中
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);

上面的代码没有错误,显示截图如下:

但是,很多情况下,我们想要显示的控件的标签是先放在char *中的,我们当然要先转换成wxString,转换的方法有很多,比如用wxString::FromUTF8(),或者可以定义一个wxString对象,调用Printf方法。然而,两种方法都不行。

如下代码:

char *label = "按钮";
wxString wxLabel;
wxLabel.Printf(wxT("%s"), label);
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxLabel, wxDefaultPosition, wxDefaultSize, 0);
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);

得到的结果是

而如果使用wxString::FromUTF8(),则控件中根本没有显示的标签。

谷歌了很久都没找到解决办法,后来突然想到,以前做一个GTK项目的时候遇到过中文出现乱码的问题,当时峰哥给我发了一个将字符串转换编码的函数,当然,GTK有自带的函数可以进行转换,是g_locale_to_utf8。而wxWidgets貌似没有这样的函数。峰哥给我的函数正好派上用场。

峰哥给我的函数是ANSI与UTF8相互转换,为什么有用,是因为VS默认的编码是ANSI。我今天在谷歌的时候,见到有人说将源代码的编码格式改成UTF8,在VS的 文件——高级保存选项中,我试过了,没用。但是用了峰哥给我的函数,效果就不一样了。

峰哥的代码是:

BOOL ansi_to_utf8(char * lpcszStr, char** lpwszStr)
{       
    WCHAR* strA;    
    int i= MultiByteToWideChar(CP_ACP, 0, (char*)lpcszStr, -1, NULL, 0);    
    strA = (WCHAR *)malloc(sizeof(WCHAR) * i);    
    MultiByteToWideChar(CP_ACP, 0, (char* )lpcszStr, -1, strA, i*2);    
    i= WideCharToMultiByte(CP_UTF8, 0, strA, -1, NULL, 0, NULL, NULL);
    *lpwszStr = (char *)malloc(i);
    WideCharToMultiByte(CP_UTF8, 0, strA, -1, *lpwszStr, i, NULL, NULL);        
    return TRUE;
}

可以把这段代码放在程序的某个头文件中,作为一个成员函数。别忘了包含windows.h头文件。

再修改上面的第二段代码如下:

char *label = "按钮2";
char *label_utf8;
this->ansi_to_utf8(label, &label_utf8);
wxButton* oneButton = new wxButton( itemFrame1, ID_BUTTON, wxString::FromUTF8(label_utf8), wxDefaultPosition, wxDefaultSize, 0);
free(label_utf8);
itemBoxSizer->Add(oneButton, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);

这样就可以正常显示了:

再次感谢 峰哥

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!