最近公司需要使用redis作为中间件,于是我就各种找资料,最后找到一个大神开发的qRedis下载地址,这个是大神使用socket开发,由衷佩服,这里膜拜一下,里面有使用事例,用起来超简单,这里鄙视一下国内分享环境,用国外大神的资源,拿来优快云赚积分,很无语。
中途用的时候弄了一上午,SET老失败,GET成功,也就是只能读不能写,然后各种找原因,最后发现是之前的redis服务器配置应该有问题,弄成只能读不能写,后来我自己建了redis服务器就搞定了。
然后主要问题来了,Qt使用redis传输中文问题,大神因为是外国人没有中文的烦恼所以没有考虑进去,我就想好吧,那就从网络编程开始弄,这类资料网络上很多,这里就不赘述。最后,找到国内大神潮落拾贝
这里感谢一下,然后愉快的复制粘贴,结果还是坑,不报错了,结果给各位上图
然后把大神的 QByteArray qb_byte=qs_part_i.toLocal8Bit();改成QByteArray qb_byte = qs_part_i.toUtf8();就完美搞定,如下图
由于本人小白,看到大神文章写到sendData时只有一半,所以不知所措,整个替换发现还是坑,怀疑大神逗我,结果是我菜,不关大神任何事,为了照顾小白,在此我把我更改过的代码贴出来,以防小白懵逼(主要怕日后自己懵逼),经过此事我发现不是没答案,而是我等小白看不懂。
void Reader::sendData(const QString &data)
{
if (!reading)
return;
QString test(data);
int k;
QChar c,next;
QStringList parts;
QString buffer="";
bool open=false;
for(k=0;k<test.length();k++)
{
c=test.at(k);
if(open)
{
next=k<test.length()-1?test
.at(k+1):' ';
if(c=='\\'&&next=='"')
{
buffer+='"';
k++;
}
else if(c=='"')
open=false;
else
buffer+=c;
}
else
{
if(!c.isSpace())
{
if(c=='"')
open=true;
else
buffer+=c;
}
else if(!buffer.isEmpty())
{
parts<<buffer;
buffer="";
}
}
}
if(!buffer.isEmpty())
{
parts<<buffer;
}
QByteArray qb_array;
qb_array.clear();
qb_array.append(QString("*%1\r\n").arg(parts.length()));
int i;
for (i = 0; i < parts.length(); i++)
{
QString qs_part_i = parts.at(i);
QByteArray qb_byte = qs_part_i.toUtf8();
qb_array.append(QString("$%1\r\n").arg(qb_byte.length()));
for (int j = 0; j < qb_byte.length(); j++)
{
qb_array.append(qb_byte[j]);
}
qb_array.append(0x0D);
qb_array.append(0x0A);
}
int i_len = qb_array.length();
socket->write(qb_array, i_len);
while (!socket->waitForBytesWritten())
{
}
}