конвертировать __int64 в std :: u32string

Я пишу родное приложение для Windows C ++, которое использует API REST Casablanca. Я пытаюсь передать целочисленное значение из приложения C ++ в сервлет Java, который будет работать в облаке. Делая GET Вызов REST, API Касабланки ожидает от меня использования std::u32string сохранить параметр запроса. Для меня несколько интуитивно понятно, почему можно использовать кодировку UTF-32, чтобы обеспечить поддержку каждого типа символов. Что не является для меня интуитивным, так это как делать это преобразование.

Вот мой текущий код:

__int64 queryID = 12345689;               // the integer to pass
std::stringstream stream;
stream << queryID;
std::string queryID_utf8(stream.str());   // the integer as a UTF-8 string
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> convert;
std::u32string queryID_utf32 = convert.from_bytes(queryID_utf8); // UTF-32 string

http_client client(U("http://localhost:8080/MyJavaWebApp"));
uri_builder builder(U("/getContent"));
builder.append_query(U("queryID"), queryID_utf32.c_str());
client.request(methods::GET, builder.to_string()) // etc.

Я также не совсем уверен, как мне следует поступать на стороне Java после получения этой строки в кодировке UTF-32. Любой совет эксперта C ++ будет принят здесь с благодарностью.

3

Решение

я использовал wchar а также swprintf и т.д., когда я работал с Касабланкой в ​​C ++.

pplx::task<MPS_Request::ProcessResult*> MPS_Request::ProcessCreate (ProcessResult * processData)
{
http_request request (methods::GET);
request.set_request_uri (L"?format=xml&action=query&titles=Main%20Page&prop=revisions&rvprop=content");

http_client client (L"http://en.wikipedia.org/w/api.php");

// Make the request and asynchronously process the response
return client.request (request).then ([processData](http_response response)
{
// Grab the status code
processData->statusCodeTSG = response.status_code ();

if (processData->statusCodeTSG == HTTP_RET_OK)
{
// Read the stream into a string
auto bodyStream = response.body ();
container_buffer<string> stringBuffer;

bodyStream.read_to_end (stringBuffer).then ([stringBuffer, processData](size_t bytesRead)
{
// Allocate and copy
const string &line = stringBuffer.collection ();
const char * output = line.c_str ();

processData->resultStreamTSG = new char [strlen (output) + 1];
strcpy_s (processData->resultStreamTSG, (strlen (output) + 1), output);
})
.wait ();
}

return processData;
});
}
1

Другие решения

Я в конечном итоге с помощью swprintf, как правильно предположил @ CharlieScott-Skinner в своем вдумчивом ответе. Хитрость здесь в том, чтобы использовать параметр форматирования %I64u чтобы убедиться, что __int64 будет обработан правильно.

В качестве общего комментария отметим, что это скорее подход в стиле C к решению этой проблемы, чем использование C ++. string классы. Как говорится, string классы были созданы, чтобы сделать нашу жизнь проще, и если есть случаи, когда они не помогают, тогда мы можем свободно попробовать другие вещи.

__int64 queryID = 9223372036854775807;                    // largest supported value
wchar_t query_buffer[30];                                 // give enough space for largest
swprintf(query_buffer, 30, L"%I64u", queryID);            //     possible value
web::json::value result = RestDownload(query_buffer);     // call helper function

// my helper method returns JSON which is then processed elsewhere
pplx::task<json::value> RestDownload(const wchar_t* queryID) {
http_client client(U("http://localhost:8080/MyJavaWebApp"));
uri_builder builder(U("/getContent"));
builder.append_query(U("queryID"), queryID);          // this is OK

return client.request(methods::GET, builder.to_string()).then([](http_response response) {
if (response.status_code() == status_codes::OK) {
return response.extract_json();
}

// Handle error cases, for now return empty json value...
return pplx::task_from_result(json::value());
});
}
0

По вопросам рекламы [email protected]