乱码的原因找到了

wxTextCtrl继承自wxTextCtrlBase,而wxTextCtrlBase继承自std::streambuf
std::streambuf是窄字节的
typedef basic_streambuf\ > streambuf;
于是在宽字符(wide char)版的wxWidget中,就出现了乱码问题。
示例代码

wxTextCtrl* debugOutput;
std::ostream *logStream;
....
logStream=new std::ostream(debugOutput);
*logStream<<"你好"<<std::endl;

乱码的原因在于 streambuf 读取字符是一个字节(byte)、一个字节的读取的。
streambuf中的字符采用的是变长(multibyte)编码。
而wxTextCtrlBase中的实现

int wxTextCtrlBase::overflow(int c){
    AppendText((wxChar)c);
    // return something different from EOF
    return 0;
}

是把streambuf的每个单字节,当作一个unicode字符,插入到TextCtrl之中。
于是,以GB2312/GBK方式编码的"你好"这样两个汉字,就会被分割成4个unicode字符。
此外,wxTextCtrl的destructor不是虚的。如果我要从这里通过继承的方式修改overflow函数的行为,
需要承担一定的风险。
如果我一定要这么做,我必须在overflow函数中引入静态变量才能解决问题。如此一来,这个函数就不是线程安全的了

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥