抛转
在使用Qt时,有时候需要将QString转为char或unsigned char后进行其他操作,通常这样是没啥大问题。但最近同事探讨了下QString如何转为unsigned char*,并当QString中包含中文时 如何转换?
我们一般就这样处理了:
const char * = QString.toStdString().c_str();
不过,貌似不是很对:
再抛
在学习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;
- 尾图
源码
关注
微信公众号搜索"Qt_io_"或"Qt开发者中心"了解更多关于Qt、C++开发知识.。
笔者 - jxd