【问题标题】:WxWidgets with Visual Studio and Unicode Sources带有 Visual Studio 和 Unicode 源的 WxWidgets
【发布时间】:2025-11-27 10:20:06
【问题描述】:

遵循UTF-8 everywhere 宣言,主要是它的一部分: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 链接

标题 - 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

【问题讨论】:

    标签: c++ visual-studio utf-8 wxwidgets


    【解决方案1】:

    有没有办法改变库的这种行为以匹配 utf-8 无处不在的宣言?

    不,不是在 Windows 下,因为 Windows 不支持 UTF-8 语言环境(原则上,它们可以由 CRT 模拟,但 AFAIK 没有编译器这样做)并且wxString(const char*) ctor 以当前语言环境编码解释字符串默认情况下。

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

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

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

    【讨论】:

    • 看来,这是可能的,但由于性能原因不推荐:groups.google.com/forum/#!topic/wx-users/Tr7QmSeuF9s 但我不知道我可以在哪里设置标志 wxUSE_UNICODE_UTF8 以使用它构建带有 msvc 的库。 CRT alsa 处理 utf-8 字符串只是 fins,AFAIK,只有 WINAPI 可能有问题,但 wx 可以处理它
    • 另外,wxUSE_UTF8_LOCALE_ONLY=1 不起作用 - wxWidgets 有一个傻瓜安全机制来防止这个选项与库一起使用,编译时使用 wxUSE_UNICODE_WCHAR 选项
    • 是的,对不起,我应该提到wxUSE_UTF8_LOCALE_ONLY 需要wxUSE_UNICODE_UTF8,所以你需要将它们都设置为true,当然,你需要重建库。至于 CRT 处理 UTF-8 就好了,你确定吗?
    • 嗯,这是一个仓促的声明:)