QString含汉字时,完美转char*和unsigned char*

抛转

     在使用Qt时,有时候需要将QString转为char或unsigned char后进行其他操作,通常这样是没啥大问题。但最近同事探讨了下QString如何转为unsigned char*,并当QString中包含中文时 如何转换?

     我们一般就这样处理了:
         const char * = QString.toStdString().c_str();

     不过,貌似不是很对:
QString含汉字时,完美转char*和unsigned char*_第1张图片

再抛

     在学习C的时候,书本抛给咱们的是char类型占1字节(0-127)并一般存储为ASCII码,也就那么几个字符(字符、数字、大小写、转义字符、一堆不可见字符等)。
     unicode\utf-8字符集编码

     那么这里说一哈,我们这用unicode\utf-8字符集编码。再说一哈这个编码汉字占2~4字节。

解决

我们来自己造轮子。工艺如下:

  • 初始化
QString text = "#打@算打1官.";
int textCustomLen = 1;									// +结束符

qDebug() << "QString:" << text;
  • 统计出实际字符长度
// 得到8,说明汉字被解为1字节。
int textLen = text.length(); 

// 按4字节汉字设定长度
for (int index = 0; index < textLen ; ++index)
{
	// 该编码汉字范围
	if(text.at(index) >= "\u4E00" && text.at(index) <= "\u9FCB")
		textCustomLen  += 4;
	else
		++textCustomLen;
}
  • 转换char*
char *buf = new char[textCustomLen];
char *tBuf = buf;
memset(tBuf ,0,textCustomLen);
for (int index = 0; index < textLen ; ++index)
{
	// 该编码汉字范围
	if(text.at(index) >= "\u4E00" && text.at(index) <= "\u9FCB")
	{
		QString vString = text.mid(index,1);
		const char *uBuf = vString.toStdString().c_str();
		memcpy(tBuf,uBuf,3);
		tBuf += 3;
	}
	else
		*tBuf++ = text[index].toLatin1();
}

qDebug() << "char * :" << buf;
  • 转换unsigned char*
unsigned char *uBuf = new unsigned char[bufLen];
memset(uBuf,0,bufLen);
memcpy(uBuf,buf,bufLen);

qDebug() << "unsigned char* :" << uBuf;
  • 收尾
tBuf = nullptr;

if(buf)
	delete buf;
buf = nullptr;

if(uBuf)
	delete uBuf;
uBuf = nullptr;
  • 尾图
    QString含汉字时,完美转char*和unsigned char*_第2张图片

源码

下载源码

关注

微信公众号搜索"Qt_io_"或"Qt开发者中心"了解更多关于Qt、C++开发知识.。

笔者 - jxd

你可能感兴趣的:(Qt,QString转char*)