QT是一个跨平台的框架
它封装了一个QString类来代表字符串,它是一个Unicode16编码的类 (每个字符占两个字节)
同时封装了一个QChar类代表宽字符
默认乱码:
QString
//乱码演示
/*QString str = "你好!世界"; //cpp是GBK编码,不能直接给QString
ui.linetxt->setText(str); *
//正确中文显示演示
QString str = QString::fromLocal8Bit("你好!世界");//用QString 下的 fromLocal8Bit()函数把中文转换成QString
ui.linetxt->setText(str)
QString text = ui.linetxt->text(); //获取用户输入
QByteArray bytes = text.toLocal8Bit(); //转换成QByteArray类型(Local8Bit是GBK的一个编码)
//QByteArray是QT封装字节数组的一个类
const char *gbk = bytes.data(); //取得bytes里的数据首地址 用常量字符指针gbk指向它
//由于我们使用的系统是中文Windows,所以本地编码就是GBK
//然而,如果我们的系统是Linux,那本地编码很可能是UTF-8 ->意味着以上都是扯蛋
------------------------------------------------------------------------------
获取用户输入并转成UTF8
QString text = ui.linetxt->text(); //获取用户输入
QByteArray bytes = text.toUtf8(); //转换成QByteArray类型(Local8Bit是GBK的一个编码)
//QByteArray是QT封装字节数组的一个类
const char *gbk = bytes.data(); //取得bytes里的数据首地址 用常量字符指针gbk指向它
int size = bytes.size(); //返回字节数
-----------------
使用QTextCodec
QTextCodec用于手工转换编码 (QString内部调用此类)
//QString(Unicode)->std::string(GBK)
static string FromUnicode(const QString& qstr) //
{
QTextCode* pCodec=QTextCodec::codecForName("gb2312"); //("GBK") QT工具类
if(!pCodec)return"";
QByteArray arr=pCodec->fromUnicode(qstr); //把qstr转换成字节数组
string cstr=arr.data() //再把它封装成string类型
return cstr;
}
#include "qtchinesesshow.h" #include"QTGBK.h" QTChinesesShow::QTChinesesShow(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(OnBtnTest())); //鼠标点击btnOK执行OnBtTest() } QTChinesesShow::~QTChinesesShow() { } int QTChinesesShow::OnBtnTest() { //100%乱码演示 /*QString str = "你好!世界"; //cpp是GBK编码,不能直接给QString ui.linetxt->setText(str); */ //正确中文显示演示 //GBK->QString(Unicode16) //QString str = QString::fromLocal8Bit("你好!世界");//用QString 下的 fromLocal8Bit()函数把中文转换成QString //ui.linetxt->setText(str); //显示 //------------------------------------------ //QString->GBK Unicpde16转换成GBK //QString text = ui.linetxt->text(); //获取用户输入 //QByteArray bytes = text.toUtf8(); //转换成QByteArray类型(Local8Bit是GBK的一个编码) // //QByteArray是QT封装字节数组的一个类 //const char *gbk = bytes.data(); //取得bytes里的数据首地址 用常量字符指针gbk指向它 //int size = bytes.size(); //由于我们使用的系统是中文Windows,所以本地编码就是GBK //然而,如果我们的系统是Linux,那本地编码很可能是UTF-8 ->意味着以上都是扯蛋 //使用UTF8 //char utf8[] = { 0xE4, 0xBD, 0xA0, 0xE5, 0xA5, 0xBD, 0 }; //QString str2 = QString::fromUtf8(utf8); string text = GBK::FromUnicode(ui.linetxt->text()); return 0; }
///////////////////////////////////////////////////////
// 封装 #ifndef _QT_GBK_H #define _QT_GBK_H #include<QString> #include<QTextCodec> #include<string> using std::string; class GBK { public: static string FromUnicode(const QString& qstr) { QTextCodec* pCodec = QTextCodec::codecForName("gb2312"); if (!pCodec)return ""; QByteArray arr = pCodec->fromUnicode(qstr); string cstr=arr.data(); return cstr; } static QString ToUnicode(const string& cstr) //QBT转换QString { QTextCodec* pCodec = QTextCodec::codecForName("gb2312"); if (!pCodec)return ""; QString qstr = pCodec->toUnicode(cstr.c_str(), cstr.length()); return qstr; } }; #endif// 使用:: QString str = GBK::ToUnicode("你好中国"); ui.linetxt->setText(str); //uilinetxt->setText(GBK::ToUnicode("你好中国")) string text = GBK::FromUnicode(ui.linetxt->text());//获取用户输入
GBK转QString封装