qt中的toUtf8, toLatin1, Local8bit, toUcs4

toLatin1、toLocal8Bit都是QString转QByteArray的方法,Latin1代表ASCII,Local8Bit代表unicode。

1、首先说下字符集。

gb18030字符集兼容了gbk字符集,以两个字节表示一个文字。windows系统可能使用的就是这两种的一种。

unicode字符集以2个或以上的字节表示一个汉字。

通用字符集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集。UCS-2用两个字节编码,UCS-4用4个字节编码。

utf8字符集以2个或以上的字节表示一个汉字。实际上具体的数值和unicode有很大的相关性。

ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF。亦称为Latin1。

2、QString内部可能是使用unicode字符集来存储文字。具体输出的时候,就可以输出该文字对应的unicode, ucs4, utf8, gb18030的编码。

3、代码示例

环境:qt5.5、msvc2013

使用qtcreator创建main.cpp,它默认代码里的汉字使用utf8字符集。不要使用msvc编译器,因为它默认汉字使用gb18030字符集

#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString tmp="汉字";
    qDebug() << "tmp=" << tmp << endl;
    qDebug() << "toUtf8" << tmp.toUtf8() << endl;       //返回utf8编码的一串数字
    qDebug() << "toLatin1" << tmp.toLatin1() << endl;   //"汉字"不在latin1字符集中,所以结果无意义
    char *p = new char[1+strlen(tmp.toLatin1().data())];
    strcpy(p, tmp.toLatin1().data());
    for (int i=0; p[i] != '\0'; i++)
    {
        printf("0x%02x ", p[i]);
    }
    printf("\n");
    delete p;
    qDebug() << "toLocal8bit" << tmp.toLocal8Bit() << endl;//返回windows操作系统设置的字符集gb18030的编码
    qDebug() << "toUcs4" << tmp.toUcs4() << endl;           //返回ucs4编码组成的QVector,一个汉字占用4字节
    return a.exec();
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
国象棋的C++代码 #include "chess_zn.h" QTcpSocket * Chess_ZN::client = new QTcpSocket; QUndoStack * Chess_ZN::undoStack = new QUndoStack(); int Chess_ZN::second = 120; bool Chess_ZN::isTurn = false; Chess_ZN::Chess_ZN(QWidget *parent) : QWidget(parent) { init(); initElse(); } void Chess_ZN::initElse(){ treeitem = 1; timer=new QTimer; portmap=0; isConn = true; start = false; isTimer = false; isSearch = false; connect(timer,SIGNAL(timeout()),this,SLOT(stopWatch())); connect(wigettree[1],SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(getInfo(QTreeWidgetItem*))); connect(wigettree[0],SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(connectToHost_PK(QTreeWidgetItem*))); connect(client,SIGNAL(connected()),this,SLOT(connected())); //连接一旦断开 connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(error(QAbstractSocket::SocketError ))); connect(client,SIGNAL(readyRead()),this,SLOT(readyRead())); peer = new PeerManager(this); peer->setServerPort(10001); items=wigettree[1]->currentItem(); item_pk=wigettree[0]->currentItem(); item_pk_info=wigettree[0]->currentItem(); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[8], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[9], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[10], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[11], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[0], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[1], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[2], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[3], SLOT(setEnabled(bool))); timer->start(1000); createUndoView(); isChoose = true; tableeditor=new TableEditor("users"); } void Chess_ZN::createUndoView() { undoVie
QT版本 //xxxx.h //log level #define LL_DEBUG 0 #define LL_INFO 1 #define LL_WARN 2 #define LL_ERROR 3 #define LL_ALARM 4 #define GetCurFileName (__FILE__) #define GetCurCodeLine (__LINE__) #define GetCurCodeFunctionName (__FUNCTION__) #define Write_Log(LEVEL, FMTLOG) WriteLog(LEVEL, FMTLOG, GetCurFileName, GetCurCodeLine, GetCurCodeFunctionName) void WriteLog(int, QString, QString, int, QString); //xxxx.cpp void WriteLog(int loglevel, QString strlogstr, QString strfilename, int iline, QString strfunname) { QString g_logdllpath(g_runPath + "/dependences/LoggingModeDLL.dll"); HINSTANCE hDll = LoadLibrary(g_logdllpath.toStdWString().data()); typedef int (__cdecl *MYFUNC)(int, char*, char*, int, char*); MYFUNC execfunc = (MYFUNC)GetProcAddress(hDll, "WriteLog"); execfunc(loglevel, const_cast<char*>(strlogstr.toLatin1().data()), const_cast<char*>(strfilename.toLatin1().data()), iline, const_cast<char*>(strfunname.toLatin1().data())); } MFC 版本 //xxxx.h //log level #define LL_DEBUG 0 #define LL_INFO 1 #define LL_WARN 2 #define LL_ERROR 3 #define LL_ALARM 4 #define GetCurFileName (__FILE__) #define GetCurCodeLine (__LINE__) #define GetCurCodeFunctionName (__FUNCTION__) #define Write_Log(LEVEL, FMTLOG) WriteLog(LEVEL, FMTLOG, GetCurFileName, GetCurCodeLine, GetCurCodeFunctionName) void WriteLog(int, CString, CString, int, CString); void WriteLog(int loglevel, CString strlogstr, CString strfilename, int iline, CString strfunname) { CString g_logdllpath(".\\LoggingModeDLL.dll"); HINSTANCE hDll = LoadLibrary(g_logdllpath.GetBuffer()); typedef int (__cdecl *MYFUNC)(int, char*, char*, int, char*); MYFUNC execfunc = (MYFUNC)GetProcAddress(hDll, "WriteLog"); execfunc(loglevel, const_cast<char*>(strlogstr.GetBuffer()), const_cast<char*>(strfilename.GetBuffer()), iline, const_cast<char*>(strfunname.GetBuffer())); }
sqlite3 数据库支持加密,分别使用QtCreator 和 VS2017 分别编译出64位 debug release DLL , (QtCreator只有动态 使用mingW 64 MSVC20147) (VS2017 有动态DLL和静态库 V14.1 ) 有工程源码,也可自行编译。 实例: QString exepath = QCoreApplication::applicationDirPath() +"/GameData.db"; int result=sqlite3_open(exepath.toLatin1().data(),&db); result=sqlite3_key(db,"abcd",4); //使用密码,第一次为设置密码 result=sqlite3_exec(db,"CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL)",0,0,0); result=sqlite3_exec(db,"INSERT INTO MyTable (MyText) VALUES ('测试!')",0,0,0); result=sqlite3_close(db); 压缩包目录结构: +---sqlite3_QT | | .qmake.stash | | sqlite3.pro | | sqlite3.pro.user | | sqlite3.vcxproj | | sqlite3.vcxproj.filters | | sqlite3.vcxproj.user | | | +---mingw_x64 | | +---debug | | | libsqlite3.a | | | sqlite3.dll | | | sqlite3.h | | | sqlite3userauth.h | | | | | \---release | | libsqlite3.a | | sqlite3.dll | | sqlite3.h | | sqlite3userauth.h | | | +---msvc2017_x64 | | +---debug | | | sqlite3.dll | | | sqlite3.h | | | sqlite3.pdb | | | sqlite3userauth.h | | | | | \---release | | sqlite3.dll | | sqlite3.h | | sqlite3userauth.h | | | \---sqlite3 | \---secure | \---src | \---sqlite3_VS2017 | sqlite3.sln | sqlite3.vcxproj | sqlite3.vcxproj.filters | sqlite3.vcxproj.user | +---msvc2017_x64 | +---debug | | +---dyn | | | sqlite3.dll | | | sqlite3.h | | | sqlite3.pdb | | | sqlite3userauth.h | | | | | \---static | | sqlite3.h | | sqlite3.lib | | sqlite3.pdb | | sqlite3userauth.h | | | \---release |

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值