QT字符串 转换大汇总

C/C++程序中数字int、字符串string、char*之间的转换方法汇总

Qt中 QString 和int, char等的“相互”转换



QString与int 之前相互转换:

1、QString 转int

QString str("100");
int tmp=str.toInt();

2、int 转QString

int tmp =100;
QString str=QString::number(tmp);

在这里插入图片描述

QStringLiteral

是Qt5中新引入的一个用来从“字符串常量”创建QString对象的宏(字符串常量指在源码中由”"包含的字符串)
StringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象,于是运行时就不再需要额外的构造开销了。

 QStringLiteral("GAAAA");



Qstring 转换char*

const char *p = qstr.toStdString().data();


或者
QString fileStr = dateTimeStr + ".txt";
const char *fileStrInfo = fileStr.toLatin1().constData(); //toUtf8()

QByteArray相关

Qt 最常用的字符串类是内码固定的 QString,而针对传统类似 C 语言 char* 的字符串,Qt 提供了 QByteArray 类来处理。QString 的字符单元是 QChar,QByteArray 的字节单元是 char。头文件 不仅自身以类的形式提供,它还针对传统 C 语言的字符串函数做了安全版本的封装,都加了 q 字母前缀,如 qstrlen、qstrncmp、qstrcpy,这些是全局函数,专门处理传统 C 语言的 char* 字符串,用法与 C 语言风格完全类似,比较简单,本节就不介绍了。本节主要介绍 QByteArray 类的使用。

QByteArray 类可以处理以 ‘\0’ 结尾的传统字符串,包括 UTF-8 编码和其他如 GBK、Big5 等多字节编码的字符串,在作为字符串使用时,QByteArray 内部字符编码格式是不限定的,可以是任意编码的,所以程序员自己必须要事先确定程序会用到哪些编码的 QByteArray 。因为 Qt5 源文件规定是 UTF-8 编码的,所以 QByteArray 内部使用 UTF-8 编码的字符串居多。QByteArray 在赋值、传参数、返回值时也是使用隐式共享机制提高运行效率,只有字符串发生修改时才会执行深拷贝。

在文件处理、网络数据收发等场景,QByteArray 类是作为纯字节数组来使用的,里面可以包含任意数据,比如一堆 ‘\0’,这时不要拿它当字符串看,它的存储长度与 qstrlen 计算的长度经常不一致。对于网络数据收发,QByteArray 经常配合 QDataStream 使用,对 Qt 数据类型做串行化(Serializing)。

https://qtguide.ustclug.org/ch03-04.htm

//testqbytearray.cpp
#include <QApplication>
#include <QTextBrowser>
#include <QDebug>
#include <QByteArray>
#include <QDataStream>
#include <QTextCodec>

#define DBUG qDebug()<< "["<< __LINE__ << "]"

void TestStr()  //内码 UTF-8
{
    //数值与字符串转换
    int nDec = 800;
    QByteArray basDec;
    basDec.setNum(nDec);    //数值转字符串
    DBUG <<basDec;
    QByteArray basReal = "125.78999";
    double dblReal = basReal.toDouble();    //字符串转数值
    DBUG << fixed<<dblReal;

    //运算符
    QByteArray basABCD = "ABCD";
    QByteArray basXYZ = "XYZ";
    DBUG <<(basABCD < basXYZ);   //二者字符编码一致才能比较!
    DBUG <<(basABCD == basXYZ);
    DBUG <<(basABCD >= basXYZ);
    DBUG <<(basABCD + basXYZ);
/*
[ 17 ] "800"
[ 20 ] 125.789990
[ 25 ] true
[ 26 ] false
[ 27 ] false
[ 28 ] "ABCDXYZ"
*/


    //子串处理
    QByteArray basHanzi = "1234打印汉字";
    //作为字符串时 QByteArray::length() 和 qstrlen() 一致
    DBUG <<basHanzi.length()<<"\t"<<qstrlen( basHanzi.data() );
    //重复
    QByteArray basMoreHanzi = basHanzi.repeated(2);
    DBUG << "basMoreHanzi:" << basMoreHanzi;
    DBUG <<basMoreHanzi.count("1234"); //统计次数
    DBUG <<basMoreHanzi.startsWith("1234");  //开头判断
    DBUG <<basMoreHanzi.endsWith("汉字");     //结尾判断
    DBUG <<basMoreHanzi.indexOf("1234");   //从左边查出现位置
    DBUG <<basMoreHanzi.lastIndexOf("1234"); //从右边查出现位置
    //替换
    basMoreHanzi.replace("1234", "一二三四");
    DBUG <<basMoreHanzi;

/*
[ 42 ] 16 	 16
[ 45 ] basMoreHanzi: "1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97""1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 46 ] 2
[ 47 ] true
[ 48 ] true
[ 49 ] 0
[ 50 ] 16
[ 53 ] "\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
*/

    //切割字符串
    QByteArray basComplexFile = "   /home/user/somefile.txt  \t\t ";
    QByteArray basFileName = basComplexFile.trimmed();  //剔除两端空白
    DBUG <<basFileName;
    //分隔得到新的 QByteArray 对象列表
    QList<QByteArray> baList = basFileName.split('/');
    //打印
    for(int i=0; i<baList.length(); i++)
    {
        DBUG <<i<<"\t"<<baList[i];
    }
    //没有段落函数

/*
[ 69 ] "/home/user/somefile.txt"
[ 75 ] 0 	 ""
[ 75 ] 1 	 "home"
[ 75 ] 2 	 "user"
[ 75 ] 3 	 "somefile.txt"
*/

}

/*
//C++ 结构体方法
struct NetData
{
    int nVersion;
    double dblValue;
    char strName[256];
};
*/
//Qt 串行化方法
QByteArray TestSerialOut()
{
    //数据
    int nVersion = 1;
    double dblValue = 125.78999;
    QString strName = QObject::tr("This an example.");
    //字节数组保存结果
    QByteArray baResult;
    //串行化的流
    QDataStream dsOut(&baResult, QIODevice::ReadWrite);  //做输出,构造函数用指针
    //设置Qt串行化版本
    dsOut.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流
    //串行化输出
    dsOut<<nVersion<<dblValue<<strName;

    //显示长度
    DBUG <<baResult.length()<<"\t"<<qstrlen(baResult.data()); //[ 115 ] 48 	 0
    //返回对象
    return baResult;
}

void TestSerialIn(const QByteArray& baIn)
{
    //输入流
    QDataStream dsIn(baIn); //只读的流,构造函数用常量引用
    //设置Qt串行化版本
    dsIn.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流
    //变量
    int nVersion;
    double dblValue;
    QString strName;
    //串行化输入
    dsIn>>nVersion>>dblValue>>strName;

    //打印
    DBUG <<nVersion;
    DBUG <<fixed<<dblValue;
    DBUG <<strName;
/*
[ 134 ] 1
[ 135 ] 125.789990
[ 136 ] "This an example."
*/
}

//测试协作
void TestCooperation()
{
    //源字符串
    QString strSrc = QObject::tr("1234abcd 千秋萬載 壹統江湖");
    //转为 UTF-8
    DBUG <<strSrc.toUtf8();

    //明确地转为 GB18030
    QTextCodec *codecGB = QTextCodec::codecForName("GB18030");
    QByteArray strGB = codecGB->fromUnicode(strSrc); //转为GB18030
    DBUG <<strGB;
    DBUG <<codecGB->toUnicode(strGB);  //转回QString

    //明确地转为 Big5
    QTextCodec *codecBig5 = QTextCodec::codecForName("Big5");
    QByteArray strBig5 = codecBig5->fromUnicode(strSrc); //转为Big5
    DBUG <<strBig5;
    DBUG <<codecBig5->toUnicode(strBig5);    //转回QString
/*
[ 150 ] "1234abcd \xE5\x8D\x83\xE7\xA7\x8B\xE8\x90\xAC\xE8\xBC\x89 \xE5\xA3\xB9\xE7\xB5\xB1\xE6\xB1\x9F\xE6\xB9\x96"
[ 155 ] "1234abcd \xC7\xA7\xC7\xEF\xC8""f\xDD""d \xD2\xBC\xBDy\xBD\xAD\xBA\xFE"
[ 156 ] "1234abcd 千秋萬載 壹統江湖"
[ 161 ] "1234abcd \xA4""d\xAC\xEE\xB8U\xB8\xFC \xB3\xFC\xB2\xCE\xA6\xBF\xB4\xF2"
[ 162 ] "1234abcd 千秋萬載 壹統江湖"
*/


}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    QString strText = QObject::tr("测试 QByteArray");
//    QTextBrowser tb;
//    tb.setText(strText);
//    tb.setGeometry(40, 40, 400, 300);
//    tb.show();

    //str
    TestStr();
    DBUG <<"............................................"<<endl;

    //serialization
    QByteArray baSerial = TestSerialOut();
    //baSerial 可用于网络发送
    //接收到 baSerial 之后解析
    TestSerialIn(baSerial);
    DBUG <<endl;

    //测试协作
    TestCooperation();

    return a.exec();
}

[ 17 ] "800"
[ 20 ] 125.789990
[ 25 ] true
[ 26 ] false
[ 27 ] false
[ 28 ] "ABCDXYZ"
[ 42 ] 16 	 16
[ 45 ] basMoreHanzi: "1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97""1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 46 ] 2
[ 47 ] true
[ 48 ] true
[ 49 ] 0
[ 50 ] 16
[ 53 ] "\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 69 ] "/home/user/somefile.txt"
[ 75 ] 0 	 ""
[ 75 ] 1 	 "home"
[ 75 ] 2 	 "user"
[ 75 ] 3 	 "somefile.txt"
[ 176 ] ............................................ 

[ 115 ] 48 	 0
[ 134 ] 1
[ 135 ] 125.789990
[ 136 ] "This an example."
[ 183 ] 

[ 150 ] "1234abcd \xE5\x8D\x83\xE7\xA7\x8B\xE8\x90\xAC\xE8\xBC\x89 \xE5\xA3\xB9\xE7\xB5\xB1\xE6\xB1\x9F\xE6\xB9\x96"
[ 155 ] "1234abcd \xC7\xA7\xC7\xEF\xC8""f\xDD""d \xD2\xBC\xBDy\xBD\xAD\xBA\xFE"
[ 156 ] "1234abcd 千秋萬載 壹統江湖"
[ 161 ] "1234abcd \xA4""d\xAC\xEE\xB8U\xB8\xFC \xB3\xFC\xB2\xCE\xA6\xBF\xB4\xF2"
[ 162 ] "1234abcd 千秋萬載 壹統江湖"
12:07:50: 程序异常结束。
12:07:50: The process was ended forcefully.
12:07:50: F:/360Downloads/build-testqbytearray-Desktop_Qt_5_9_8_MinGW_32bit-Debug/debug/testqbytearray.exe crashed.

12:07:52: Starting F:\360Downloads\build-testqbytearray-Desktop_Qt_5_9_8_MinGW_32bit-Debug\debug\testqbytearray.exe...
[ 17 ] "800"
[ 20 ] 125.789990
[ 25 ] true
[ 26 ] false
[ 27 ] false
[ 28 ] "ABCDXYZ"
[ 42 ] 16 	 16
[ 45 ] basMoreHanzi: "1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97""1234\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 46 ] 2
[ 47 ] true
[ 48 ] true
[ 49 ] 0
[ 50 ] 16
[ 53 ] "\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97\xE4\xB8\x80\xE4\xBA\x8C\xE4\xB8\x89\xE5\x9B\x9B\xE6\x89\x93\xE5\x8D\xB0\xE6\xB1\x89\xE5\xAD\x97"
[ 69 ] "/home/user/somefile.txt"
[ 75 ] 0 	 ""
[ 75 ] 1 	 "home"
[ 75 ] 2 	 "user"
[ 75 ] 3 	 "somefile.txt"
[ 185 ] ............................................ 

[ 115 ] 48 	 0
[ 134 ] 1
[ 135 ] 125.789990
[ 136 ] "This an example."
[ 192 ] 

[ 150 ] "1234abcd \xE5\x8D\x83\xE7\xA7\x8B\xE8\x90\xAC\xE8\xBC\x89 \xE5\xA3\xB9\xE7\xB5\xB1\xE6\xB1\x9F\xE6\xB9\x96"
[ 155 ] "1234abcd \xC7\xA7\xC7\xEF\xC8""f\xDD""d \xD2\xBC\xBDy\xBD\xAD\xBA\xFE"
[ 156 ] "1234abcd 千秋萬載 壹統江湖"
[ 161 ] "1234abcd \xA4""d\xAC\xEE\xB8U\xB8\xFC \xB3\xFC\xB2\xCE\xA6\xBF\xB4\xF2"
[ 162 ] "1234abcd 千秋萬載 壹統江湖"



uchar数组 和 char数组 互转

#include <stdio.h>
#include <string.h>


void convert_uchar_to_char(unsigned char* in_uchar,  char* out_char, int uc_len)
{
	int i=0;
	char c[2];
	char out_char_tmp[1024];
	memset(c,0x0, sizeof(c));
	memset(out_char_tmp,0x0, sizeof(out_char_tmp));

	for(i=0; i < uc_len; i++)
	{	
		sprintf(c,"%c", in_uchar[i]);
		//printf("[%d]:%s\n", i, c);
		strcat(out_char_tmp, c);
	}

	strcpy(out_char, out_char_tmp);
}

 
void convert_char_to_uchar(char* in_char,  unsigned char* out_uchar, int c_len)
{

	int i;
	char char_buf[1024];
	//unsigned char uchar_buf[1024];
	memset(char_buf,0x0, sizeof(char_buf));
	//memset(uchar_buf,0x0, sizeof(uchar_buf));

	strcpy(char_buf,in_char);
	printf("\n[%d]c_len:%d\n", __LINE__, c_len);

	for ( i=0; i<c_len; i++ ) 
	{
		//uchar_buf[i]=(unsigned char)char_buf[i];
		out_uchar[i]=(unsigned char)char_buf[i];
	}

}


 
int main()
{

	//printf("uchar %d\n", sizeof(unsigned char));
	int i=0;
	char c_str[1024] = {0};
	char c_strxxx[1024] = {0};
	strcpy(c_str,"nWBUqDWDmO5ZU2J0pSkF66HwoA0vuvUTK6zPotvpycLKV1QxJ2c4sKRot5DAeXdx");
	unsigned char uc_str[1024] = {0};

	convert_char_to_uchar(c_str, uc_str, strlen(c_str));
	printf("\n[%d]--------------convert_char_to_uchar->uc_str:%s----------\n", __LINE__,uc_str);

	for ( i=0; i<strlen(c_str); i++ ) 
	{
		printf("[%d]%x ", i,uc_str[i]);		
	}
	printf("\n------------------\n", __LINE__);


	int len = strlen((char*)uc_str);
	convert_uchar_to_char(uc_str,c_strxxx,len);

	printf("\n[%d]--------------convert_uchar_to_char->c_strxxx:%s----------\n", __LINE__,c_strxxx);
	return 0;
}

windows 下验证
在这里插入图片描述

PS C:\Users\dell\Desktop\code_test> gcc .\uchar_to_char_csdn.c
PS C:\Users\dell\Desktop\code_test> .\a.exe

[34]c_len:64

[57]--------------convert_char_to_uchar->uc_str:nWBUqDWDmO5ZU2J0pSkF66HwoA0vuvUTK6zPotvpycLKV1QxJ2c4sKRot5DAeXdx----------
[0]6e [1]57 [2]42 [3]55 [4]71 [5]44 [6]57 [7]44 [8]6d [9]4f [10]35 [11]5a [12]55 [13]32 [14]4a [15]30 [16]70 [17]53 [18]6b [19]46 [20]36 [21]36 [22]48 [23]77 [24]6f [25]41 [26]30 [27]76 [28]75 [29]76 [30]55 [31]54 [32]4b [33]36 [34]7a [35]50 [36]6f [37]74 [38]76 [39]70 [40]79 [41]63 [42]4c [43]4b [44]56 [45]31 [46]51 [47]78 [48]4a [49]32 [50]63 [51]34 [52]73 [53]4b [54]52 [55]6f [56]74 [57]35 [58]44 [59]41 [60]65 [61]58 [62]64 [63]78
------------------

[69]--------------convert_uchar_to_char->c_strxxx:nWBUqDWDmO5ZU2J0pSkF66HwoA0vuvUTK6zPotvpycLKV1QxJ2c4sKRot5DAeXdx----------
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值