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 ...
-
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.
-
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.