C++ 解码base64时GtkTextView中出现UTF-8错误

C++ 解码base64时GtkTextView中出现UTF-8错误,c++,utf-8,gtk,base64,gtkmm,C++,Utf 8,Gtk,Base64,Gtkmm,这几天我一直在想办法。我所要做的就是解码base64字符串并将其添加到Gtk::TextView。代码如下: txtbuffer_ = Gtk::TextBuffer::create(); txtview_.set_buffer(txtbuffer_); const Glib::ustring str = Glib::Base64::decode("YmJi3A=="); txtbuffer_->set_text(str); 当我运行程序时,我得到错误: Gtk-CRITICAL **:

这几天我一直在想办法。我所要做的就是解码base64字符串并将其添加到Gtk::TextView。代码如下:

txtbuffer_ = Gtk::TextBuffer::create();
txtview_.set_buffer(txtbuffer_);
const Glib::ustring str = Glib::Base64::decode("YmJi3A==");
txtbuffer_->set_text(str);
当我运行程序时,我得到错误:

Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed
此错误仅在使用Unicode字符时发生。当文本为ASCII时,一切正常。 我已经尝试了三种不同的base64解码器,我尝试使用std::string和Glib::ustring来处理所有不同的解码器。我还尝试使用函数
Glib::locale\u to_utf8()
,但在抛出'Glib::ConvertError'实例后,出现了调用的错误
terminate
。我试着使用
Glib::convert
,但出现了相同的错误

我知道Gtk::TextView可以显示Unicode,因为如果我使用Unicode将文本设置为字符串,它将显示文本。 我读到Gtk::TextView以UTF-8显示文本,所以我认为我的问题是解码的字符串没有以UTF-8编码,但我不确定。所以我的问题是如何让Gtk::TextView显示解码后的base64

补充说明:我使用的是Gtkmm的3.8版

使用版本3.12进行测试,相同的错误消息

最小程序:

//测试h

#ifndef TEST_H_
#define TEST_H_

#include <gtkmm.h>

class MainWindow : public Gtk::Window
{
public:
    MainWindow();
    virtual ~MainWindow();

protected:
    Gtk::Box box_main;
    Gtk::TextView txtview_;
    Glib::RefPtr<Gtk::TextBuffer> txtbuffer_;
};

#endif /* TEST_H_ */
//main.cpp

#include "test.h"

int main(int argc, char* argv[])
{
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "test.program");

    MainWindow mw;

    return app->run(mw);
}
#包括“test.h”
int main(int argc,char*argv[])
{
Glib::RefPtr app=Gtk::Application::create(argc,argv,“test.program”);
主窗口mw;
返回应用程序->运行(mw);
}
来自文档:

请注意,返回的二进制数据不一定以零结尾, 因此,不应将其用作字符串

这意味着utf8 validate将读取超出范围的内容,很可能接近1获取一个字节序列,但该序列不是有效的utf8字符


但即使这样也无法解决问题。似乎长度太长了,最后一个值只是垃圾

所以你可以使用(我推荐)


所以我猜这是gtk+中的一个bug(gtkmm封装了它)

它不起作用的原因是因为我编码的字符串不是UTF-8。感谢:。我发现编码是ISO-8859-1。因此,有两种修复方法,首先,首先将字符串编码为utf8:

const Glib::ustring str2 = Glib::Base64::encode("bbbÜ");
或者您必须找出字符串的原始编码,因此对我来说,这是可行的:

Glib::convert(base64_str, "UTF-8", "ISO-8859-1");

你可以添加一个最小的可编译的例子,对我来说,这闻起来很可疑,我想看看它。。。
gsize len = 0;
const gchar *ret = (gchar*)g_base64_decode (x, &len);

len --;
const Glib::ustring str(ret, len);
g_free (ret);
const Glib::ustring str2 = Glib::Base64::encode("bbbÜ");
Glib::convert(base64_str, "UTF-8", "ISO-8859-1");