QT-QString与Qchar

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封装

 

posted on 2016-09-23 19:20  洪荒剑君  阅读(3829)  评论(0编辑  收藏  举报

导航