C++ 带有Visual Studio和Unicode源代码的WxWidgets
在宣言之后,主要是它的一部分:,我用wxWidgets创建了这个简单的示例。我希望wxWidgets将字符串文本解释为UTF-8字符串,但似乎这个库让我错了 单个源文件-C++ 带有Visual Studio和Unicode源代码的WxWidgets,c++,visual-studio,utf-8,wxwidgets,C++,Visual Studio,Utf 8,Wxwidgets,在宣言之后,主要是它的一部分:,我用wxWidgets创建了这个简单的示例。我希望wxWidgets将字符串文本解释为UTF-8字符串,但似乎这个库让我错了 单个源文件-main.cpp,编码为UTF-8,无签名(用msvc术语): 与WxWidgets库版本3.0.2链接 标题- 二进制文件- 运行此示例时,生成的窗口中的文本为而不是而不是而不是而不是而不是而不是。这意味着,wxWidgets无法将我的字符串文本解释为UTF-8,但会将其解释为其他内容-可能是系统编码中的文本,即windows
main.cpp
,编码为UTF-8,无签名
(用msvc术语):
与WxWidgets库版本3.0.2链接
标题-
二进制文件-
运行此示例时,生成的窗口中的文本为而不是而不是而不是而不是而不是而不是。这意味着,wxWidgets无法将我的字符串文本解释为UTF-8,但会将其解释为其他内容-可能是系统编码中的文本,即windows-1251
是否有任何方法可以改变库的这种行为以匹配utf-8 everywhere宣言
结论:
我放弃了。我设法用msvc和flagwxUSE\u UNICODE\u UTF8
构建了这个库,但是如果库配置头中没有一些复杂的更改,它将毫无帮助。看起来,此选项仅适用于POSIX
是否有任何方法可以改变库的这种行为以匹配utf-8 everywhere宣言
不,不在Windows下,因为Windows不支持UTF-8语言环境(原则上,它们可以由CRT模拟,但AFAIK没有编译器进行模拟),并且默认情况下,wxString(const char*)
ctor在当前语言环境编码中解释字符串
但是,有两种简单的解决方案:
明确使用wxString::FromUTF8()
使用wxString(const wchar_t*)
ctor和L“…”
wide char参数
为了完整起见,您还可以通过使用wxUSE\u UTF8\u LOCALE\u ONLY=1
重新构建UTF-8窄文本来强制库接受UTF-8窄文本,但我不确定这是否可行,因为CRT区域设置仍然不同,因此在任何CRT函数中使用非ASCII字符很可能无法按预期工作,所以我绝对不建议这样做,除非您只是好奇地想看看会发生什么。这似乎是可能的,尽管由于性能原因不建议这样做:但我不知道在哪里可以设置标志wxUSE\u UNICODE\u UTF8,以便使用msvc构建it库。CRT alsa处理utf-8字符串只是fins,顺便说一句,只有WINAPI可能有问题,但wx也可以处理它,wxUSE\u UTF8\u LOCALE\u only=1
不起作用-wxWidgets有一个傻瓜安全机制来防止此选项与库一起使用,使用wxUSE\u UNICODE\u WCHAR
选项编译,抱歉,我应该提到,wxUSE\u UTF8\u LOCALE\u ONLY
需要wxUSE\u UNICODE\u UTF8
,因此您需要将两者都设置为true,当然,还需要重建库。至于CRT如何处理UTF-8,你真的确定吗?嗯,这是一个仓促的声明:)
#include <wx/wx.h>
class Mainw: public wxFrame
{
public:
Mainw(wxWindow * parent, wxWindowID wxId, const wxString & label)
: wxFrame(parent, wxId, label)
{
wxBoxSizer * sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(new wxTextCtrl(this, wxID_ANY, wxT("Кириллица")), 1, wxEXPAND | wxALL, 5);
this->SetSizer(sizer);
}
};
class MyApp: public wxApp
{
public:
bool OnInit()
{
Mainw *f = new Mainw(NULL, wxID_ANY, wxT("Frame"));
f->Show();
return true;
}
};
IMPLEMENT_APP(MyApp)
UNICODE
_UNICODE
WIN32
__WXMSW__
_WINDOWS
_DEBUG
__WXDEBUG__
wxUSE_UNICODE=1
WXUSINGDLL=1