具有 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 默认解释当前语言环境编码中的字符串。
但是有两个简单的解决方案:
- 明确使用
wxString::FromUTF8()
。
- 将
wxString(const wchar_t*)
构造器与 L"..."
宽字符参数一起使用。
为了完整起见,您还可以通过使用 wxUSE_UTF8_LOCALE_ONLY=1
重建它来强制库接受 UTF-8 窄文本,但我不确定这是否会起作用,因为 CRT 语言环境会仍然不同,因此将非 ASCII 字符与任何 CRT 函数一起使用很可能无法按预期工作,所以我绝对 不 推荐这样做,除非你只是想看看会发生什么.
在 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 默认解释当前语言环境编码中的字符串。
但是有两个简单的解决方案:
- 明确使用
wxString::FromUTF8()
。 - 将
wxString(const wchar_t*)
构造器与L"..."
宽字符参数一起使用。
为了完整起见,您还可以通过使用 wxUSE_UTF8_LOCALE_ONLY=1
重建它来强制库接受 UTF-8 窄文本,但我不确定这是否会起作用,因为 CRT 语言环境会仍然不同,因此将非 ASCII 字符与任何 CRT 函数一起使用很可能无法按预期工作,所以我绝对 不 推荐这样做,除非你只是想看看会发生什么.