GSOAP искажает utf-8 в std :: string - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть сервер C ++, использующий GSOAP.Один из 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&#x141;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 плохо обрабатывает юникод.Я хочу, чтобы он обрабатывал байты, отправленные как есть.

Я мог бы добавить отображение в typemap.dat: xsd__string = | std::wstring, но я не хочу использовать std :: wstring - это не utf-8 в любом случае.

1 Ответ

0 голосов
/ 22 ноября 2018

GSOAP по умолчанию не обрабатывает символы вне латинского набора: doc .Его можно изменить во время инициализации контекста мыла с помощью флага :

struct soap *soap = soap_new1( SOAP_C_UTFSTRING );
...