[SOLVED] Double or single quoting: compiler dependent?
-
Hallo.
I have a simple predefined string:
pSender->sendTextMessage(QString("{\"action\":\"auth\",\"status\":\"error\",\"data\": {\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}") );
As you might guess, it is about WebSocket programming.
The problem I have is that when I compile with msvc2013,
this message string is created and transmitted properly with all the double quotes at the right place:{"action":"auth","status":"error","data": {"id":3,"msg":"Unknown user or incorrect password."}}
But when I compile with
gcc version 4.9.1 (Ubuntu 4.9.1-16ubuntu6)
, I get this output
on the client side:{ action: 'auth',status: 'error',data: {id:'3', msg:'Unknown user or incorrect password.'} }
As you see, the JSON tags have no quote signs at all and their values are single quoted
which is not JSON standard.I read through http://stackoverflow.com/questions/21431633/does-g-meets-stdstring-c11-requirements. Do not know if I went astray with that...
But on the other hand side: such a simple thing as quoting a string should be compiler dependent?So would updating to g++-5 solve the problem as this Stackoverflow link says:
The other answers were correct at the time, but as of nowadays, accordingly to the GCC 5.x Change Log, libstdc++ as shipped by gcc 5 is now fully C++11 conformant. -
This post is deleted!
-
Just tried on Ubuntu with g++:
std::cout << QString("{\"action\":\"auth\",\"status\":\"error\",\"data\": {\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}").toStdString();
and got correct result.
-
Just tried on Ubuntu with g++:
std::cout << QString("{\"action\":\"auth\",\"status\":\"error\",\"data\": {\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}").toStdString();
and got correct result.
-
g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
-
In this case I see:
"{\"action\":\"auth\",\"status\":\"error\",\"data\": {\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}"
-
In this case I see:
"{\"action\":\"auth\",\"status\":\"error\",\"data\": {\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}"
Yes, seems to be something QWebSockets and compiler specific.
See http://code.woboq.org/qt5/qtwebsockets/src/websockets/qwebsocket_p.cpp.html#_ZN17QWebSocketPrivate15sendTextMessageERK7QStringqint64 QWebSocketPrivate::sendTextMessage(const QString &message) { return doWriteFrames(message.toUtf8(), false); }
And so on as
doWriteFrames
does comschar*
conversion. -
toUtf8() returns a QByteArray, QByteArray::data() returns char*. if I do:
std::cout << QString("{\"action\":\"auth\",\"status\":\"error\",\"data\": {\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}").toUtf8().data();
I still get the correct result.
I don't think it is a compiler issue (why should compiler remove " or replace them with ' ?).
How do you print out the string? -
toUtf8() returns a QByteArray, QByteArray::data() returns char*. if I do:
std::cout << QString("{\"action\":\"auth\",\"status\":\"error\",\"data\": {\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}").toUtf8().data();
I still get the correct result.
I don't think it is a compiler issue (why should compiler remove " or replace them with ' ?).
How do you print out the string?@jsulm said:
std::cout << QString("{"action":"auth","status":"error","data": {"id":3,"msg":"Unknown user or incorrect password."}}").toUtf8().data();
I set up this simple app:
#include <QCoreApplication> #include <iostream> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); std::cout << QString("{\"action\":\"auth\",\"status\":\"error\",\"data\":{\"id\":3,\"msg\":\"Unknown user or incorrect password.\"}}").toUtf8().constData(); return a.exec(); }
This works as it should with mingw51_x64 and msvc2013_x64 on Windows.
But with gcc version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2) no output is printed out at all,
although it compiles without errors.So if it is not a compiler issue then it is a compiler installation issue.
-
As always complicated problems have unexpectedly simple solutions.
Due to restricted user privileges I did not see the old chat server process
started by a colleague of mine.So we were testing the old version all the time where the quoting issue
had not been yet dealt with.