C++ 带有Visual Studio和Unicode源代码的WxWidgets

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

在宣言之后,主要是它的一部分:,我用wxWidgets创建了这个简单的示例。我希望wxWidgets将字符串文本解释为UTF-8字符串,但似乎这个库让我错了

单个源文件-
main.cpp
,编码为
UTF-8,无签名
(用msvc术语):

与WxWidgets库版本3.0.2链接

标题-

二进制文件-

运行此示例时,生成的窗口中的文本为
而不是
而不是
而不是
而不是
而不是
而不是
。这意味着,wxWidgets无法将我的字符串文本解释为UTF-8,但会将其解释为其他内容-可能是系统编码中的文本,即
windows-1251

是否有任何方法可以改变库的这种行为以匹配utf-8 everywhere宣言

结论: 我放弃了。我设法用msvc和flag
wxUSE\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