具有 Visual Studio 和 Unicode 源代码的 WxWidgets

WxWidgets with Visual Studio and Unicode Sources

UTF-8 everywhere manifesto, and mostly its part: how to do text on 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 链接

Headers - 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

是 运行,这个例子产生 window 文本 Кириллица,而不是 Кириллица(有类似的东西,但它变成了这个,当我尝试到 select 复制到这里)。这意味着,wxWidgets 无法将我的字符串文字解释为 UTF-8,而是将其解释为其他东西——可能是系统编码中的文本,即 windows-1251.

有什么方法可以改变库的这种行为以匹配 utf-8 无处不在的宣言吗?

结论:

我放弃了。我设法用 msvc 和标志 wxUSE_UNICODE_UTF8 构建了库,但如果不对库配置进行一些复杂的更改 headers,它也无济于事。看来,这个选项只有POSIX

Is there any way to change this behavior of library to match utf-8 everywhere manifesto?

不,不在 Windows 下,因为 Windows 不支持 UTF-8 语言环境(原则上,它们可以被 CRT 模拟,但据我所知,没有编译器这样做)和 wxString(const char*) ctor 默认解释当前语言环境编码中的字符串。

但是有两个简单的解决方案:

  1. 明确使用 wxString::FromUTF8()
  2. wxString(const wchar_t*) 构造器与 L"..." 宽字符参数一起使用。

为了完整起见,您还可以通过使用 wxUSE_UTF8_LOCALE_ONLY=1 重建它来强制库接受 UTF-8 窄文本,但我不确定这是否会起作用,因为 CRT 语言环境会仍然不同,因此将非 ASCII 字符与任何 CRT 函数一起使用很可能无法按预期工作,所以我绝对 推荐这样做,除非你只是想看看会发生什么.