mocode9 mocode9 - 9 months ago 52
reST (reStructuredText) Question

C++ Convert wstring to Unicode

I'm trying to use the rest API and one of the functions has an example like this:

uri_builder builder(U("/test.php"));
builder.append_query(U("worker"), U("hello"));


I want to use a variable instead of the string literal.
For now I have a std::wstring variable that I want to use but I can't figure out how to use it with the U (unsigned) prefix working on it.

Any suggestions?

I've tried

std::wstring name = L"the_name";
builder.append_query(U("worker"), U(the_name.c_str()));


I've also tried

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
std::string uWorkerName = convert.to_bytes(the_name);


My latest failed attempt

std::u32string uWorkerName(workerName.begin(), workerName.end());


The last one allowed me to use the API but when the data hit my php page it displayed garbage data such as random numbers and capital letters.

Answer Source

If I am not mistaken your rest api docs are under this url:

https://microsoft.github.io/cpprestsdk/namespaceutility_1_1conversions.html

as you can see above, this namespace : utility::conversions, proivides various conversion functions which should be of use to you. Example:

std::string name = "the_name";
builder.append_query(U("worker"), utility::conversions::to_string_t(name));

If you want your name to be composed of wchar_t characters, then above namespace contains also overloads for utf16string arguments. From this site:

https://microsoft.github.io/cpprestsdk/basic__types_8h_source.html

You can learn that utf16string always tries to be string of two byte characters. Under windows it should be typedef std::wstring utf16string; while on linux-es probably typedef std::u16string utf16string;.