我有使用GSOAP的C ++服务器。一种API接受字符串。
<message name="concatRequest">
<part name="a" type="ns:password"/><!-- ns__concat::a -->
<part name="b" type="xsd:string"/><!-- ns__concat::b -->
</message>
int billon__concat( struct soap *soap, std::string a, std::string b, std::string &result )
{
// std::cout <<"PACZPAN A:"<<a<<" B:"<<b <<std::endl;
std::cout <<"PACZPAN B[0..3]: " << (int)b[0] << " " << (int)b[1] << " " << (int)b[2] << " " <<(int)b[3] << std::endl;
std::cout <<"PACZPAN B[0..3]: " << (char)b[0] << " " << (char)b[1] << " " << (char)b[2] << " " <<(char)b[3] << std::endl;
result = a + b;
// std::cout <<"PACZPAN res:"<<result <<std::endl;
return SOAP_OK;
}
ns::password
也是一个字符串。
现在,我通过两种不同的方式发送带有参数B ='PŁOCK'的请求,这在wireshark中显示为'PŁOCK'或PŁOCK
,所以我认为两者都是正确的。
还记录gsoap打印:
POST / HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
Content-Length: 471
Host: localhost:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:calc">
<soapenv:Header/>
<soapenv:Body>
<urn:concat soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<a xsi:type="urn:password"> </a>
<b xsi:type="xsd:string">PŁOCK</b>
</urn:concat>
</soapenv:Body>
</soapenv:Envelope>
服务器接收到它后,它将成为PAOCK。 ASCII之外没有坏字节,只是字母不同。
PACZPAN B[0..3]: 80 65 79 67
PACZPAN B[0..3]: P A O C
我不在乎std :: string不能很好地处理unicode。我希望它处理按原样发送的字节。
我可以在typemap.dat:xsd__string = | std::wstring
中添加映射,但是我不想使用std :: wstring-无论如何它都不是utf-8。