WxWidgets with Visual Studio and Unicode Sources

WxWidgets with Visual Studio and Unicode Sources

本文关键字:Unicode Sources and Studio with Visual WxWidgets      更新时间:2023-10-16

遵循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默认以当前区域设置编码解释字符串。

有两个简单的解决方案:

  1. 明确使用wxString::FromUTF8()
  2. 使用wxString(const wchar_t*) ctor和L"..."宽char参数

为了完整起见,您还可以通过用wxUSE_UTF8_LOCALE_ONLY=1重建它来强制库接受UTF-8窄文本,但我不确定这是否会起作用,因为CRT区域设置仍然不同,因此在任何CRT函数中使用非ascii字符很可能不会像预期的那样工作,所以我绝对建议这样做,除非您只是好奇会发生什么。