遵循UTF-8无处不在的宣言,主要是它的部分:如何在Windows上处理文本,我用wxWidgets创建了这个简单的示例。我希望wxWidgets将字符串解释为UTF-8字符串,但似乎该库让我错了。
单个源文件- main.cpp
,编码为UTF-8 without signature
(msvc术语):
#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
链接WxWidgets库版本3.0.2
报头- http://sourceforge.net/projects/wxwindows/files/3.0.2/wxWidgets-3.0.2_headers.7z/download
二进制文件- http://sourceforge.net/projects/wxwindows/files/3.0.2/binaries/wxMSW-3.0.2_vc90_Dev.7z/download
运行时,此示例生成文本Кириллица
的窗口,而不是Кириллица
(有类似的东西,但它变成了这个,当我试图选择它复制到这里时)。这意味着,wxWidgets无法将我的字符串字面值解释为UTF-8,而是将其解释为其他东西-可能是系统编码中的文本,这是windows-1251
。
是否有办法改变库的这种行为以匹配utf-8到处宣言?
结论:
我放弃了。我设法用msvc和标志wxUSE_UNICODE_UTF8
构建库,但如果没有在库配置头中进行一些复杂的更改,它将没有帮助。这个选项似乎只支持POSIX
是否有办法改变库的这种行为以匹配utf-8到处宣言?
不,在Windows下不支持,因为Windows不支持UTF-8区域设置(原则上,它们可以由CRT模拟,但AFAIK没有编译器这样做),wxString(const char*)
ctor默认以当前区域设置编码解释字符串。
有两个简单的解决方案:
- 明确使用
wxString::FromUTF8()
- 使用
wxString(const wchar_t*)
ctor和L"..."
宽char参数
为了完整起见,您还可以通过用wxUSE_UTF8_LOCALE_ONLY=1
重建它来强制库接受UTF-8窄文本,但我不确定这是否会起作用,因为CRT区域设置仍然不同,因此在任何CRT函数中使用非ascii字符很可能不会像预期的那样工作,所以我绝对建议不这样做,除非您只是好奇会发生什么。