Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Qt / WSDL / gSOAP = Encoding problems



  • hi guys,

    I am new to Qt, I need to make a call Web method in my Web service. I started using gSOAP, it works, service calls, but after 2 days of scratching their heads over the encodings.

    Application code:
    @
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));

    CWebService* ws = new CWebService();
    QString Result;
    QString input = "Test, Некая строка";

    if(ws->Test(input, Result))
    {
    //Result = "Server value: Test, Некая строка"
    }
    @

    My test Web method is very simple, it takes a string and returns a modified string, for example: Ship: "test", We get: "Server value: test" When the value "test" comes to the server, Web service sees this value as a "test". The problems start when I send a value: Ship: "Test, Некая строка," We get: "Server value: Test, Некая строка" The application everything is fine, but on the server instead of the "Test, Некая строка" comes the string "Test, Íåêàÿ ñòðîêà"!!! I experimented with all the encoding, I tried to understand how to convert character sets should be turned to this line, and I have not found it.

    Please, Help understand the problem ...


  • Moderators

    Have you tried this:
    @
    if(ws->Test(input.toUtf8(), Result))
    @

    QString stores data as UTF-16, and you probably send that.



  • I try this, but now:
    Web service value = "WS: Test, Некая строка"
    Result = "Server value: Test, Некая строка"

    [quote author="sierdzio" date="1339750726"]Have you tried this:
    @
    if(ws->Test(input.toUtf8(), Result))
    @

    QString stores data as UTF-16, and you probably send that.[/quote]



  • Can't you just use UTF-8 on booth sides(server and client)? Why are you messing up with local encoding? Anyway, it seems what your string are sent in windows-1251 encoding but the server thinks/shows string in latin-1 . Take wireshark and look at the client <-> server requests/responses in which language they are talking to each-over and to you.

    One more time for clarify: “Test, Íåêàÿ ñòðîêà” is a ASCII windows-1251 string, represented in ASCII latin-1 charset encoding.


  • Moderators

    Haha, ok, that's not what we call an improvement. Encoding can be really tricky. You have to remember, in your case:

    • you use 1 encoding in your source file
    • this file can be saved using ANOTHER encoding
    • compiler can expect and/ or internally use different encoding from both above
    • you send it over a network, which has it's own encodings...
    • and your web service might be using another one

    Good luck :) Also, I am not sure your use of ::codecForCStrings() is correct, but to be really honest I just don't know how it should look like. Consult the docs.



  • [quote author="AcerExtensa" date="1339751087"]Can't you just use UTF-8 on booth sides(server and client)? Why are you messing up with local encoding? Anyway, it seems what your string are sent in windows-1251 encoding but the server thinks/shows string in latin-1 . Take wireshark and look at the client <-> server requests/responses in which language they are talking to each-over and to you.

    One more time for clarify: “Test, Íåêàÿ ñòðîêà” is a ASCII windows-1251 string, represented in ASCII latin-1 charset encoding. [/quote]

    Yes you are right! I converted the incoming value in the Value parameter of my Web Method .Asmx Web Service and was the original meaning in Russian.

    The Web service code in C #
    @
    [WebMethod]
    public string Test(string Value)
    {
    Value = Encoding.GetEncoding(1251).GetString(Encoding.GetEncoding("Latin1").GetBytes(Value));
    //some code ...
    }
    @

    I must say, my Web service is running in UTF-8 on the request and response. It turns out that the problem in my Qt application, namely, the conversion takes place somewhere in the encoding Latin1 ??? o_O



  • maybe in gSOAP? look with wireshark into Request Headers from your app.


Log in to reply