Qt之GB2312\GBK字符与QString转换

用途

在中国国内与其它数据接口通讯时,经常会遇到GB2312\GBK格式的字符,这时需要进行数据格式转换
否则只有ASCII码正常,而其它就是乱码。

设计

第一步:设置系统格式

在main.c文件下配置UTF-8

#include <QTextCodec>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //编码格式设置
    {
      QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
      QTextCodec::setCodecForLocale(utf8);
    }
    ......
}

第二步:设计经常使用的子函数

QString 为unicode码,转为GBK码

/******************************************************
函数名:
功能: QString 为unicode码,转为GBK码
输入:QString str 如"123"  MaxLen转换最大长度,此时实际GB2312Chars[]长度必须是MaxLen+1
输出:INT8U *GB2312Chars
例 str = "1234",MaxLen = 3,转换后,GB2312Chars[0] = 0x31,
                                 GB2312Chars[1] = 0x32,
                                 GB2312Chars[2] = 0x33,
                                 GB2312Chars[3] = 0x00,
*******************************************************/
INT32S ToolFunc::QStringToGB2312Chars(QString str, INT8U *GB2312Chars, INT32S MaxLen)
{
   //qDebug()<<"QStringToGB2312Chars";
    QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
    QTextCodec* gbk = QTextCodec::codecForName("gbk");
    QString strUnicode= utf8->toUnicode(str.toLocal8Bit().data());
    QByteArray tt= gbk->fromUnicode(strUnicode);
   INT32S ttLen=tt.size(); //结果不包括0x00
   INT32S i ;
   for (i = 0;(i<ttLen)&&(i< MaxLen);i++)
   {
       GB2312Chars[i] =static_cast<INT8U>( tt.at(i));
   }
   GB2312Chars[i] =  0x00;
   return i;
}

将GB2312/GBK字符串转化为QString

/******************************************************
函数名:
功能:将GB2312/GBK字符串转化为QString
输入:字符串:GB2312Chars,如
                                 GB2312Chars[0] = 0x31,
                                 GB2312Chars[1] = 0x32,
                                 GB2312Chars[2] = 0x33,
                                 GB2312Chars[3] = 0x00,

输出:QString str("123")
*******************************************************/
void ToolFunc::GB2312CharsToQString(INT8U *GB2312Chars, QString &str)
{
    QByteArray arry;
    ToolFunc::charArrToByteArrayCopy(arry,GB2312Chars,ToolFunc::CharsLength(GB2312Chars));
    QTextCodec* utf8Codec = QTextCodec::codecForName("utf-8");
    QTextCodec* gb2312Codec = QTextCodec::codecForName("gb2312");

    QString strUnicode = gb2312Codec ->toUnicode(arry);    //无编码
    QByteArray ByteUTF8 = utf8Codec ->fromUnicode(strUnicode);     //无编码转换
    str = QString::fromLocal8Bit(ByteUTF8);
}

效果

用汉字测试,正常。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值