C++ 将 wstring 转换为 Unicode

Posted

技术标签:

【中文标题】C++ 将 wstring 转换为 Unicode【英文标题】:C++ Convert wstring to Unicode 【发布时间】:2016-11-16 21:49:47 【问题描述】:

我正在尝试使用其余 API,其中一个函数有一个这样的示例:

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

我想使用变量而不是字符串文字。 现在我有一个我想使用的 std::wstring 变量,但我不知道如何将它与 U(无符号)前缀一起使用。

有什么建议吗?

我试过了

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

我也试过

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

我最近一次失败的尝试

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

最后一个允许我使用 API,但是当数据访问我的 php 页面时,它显示垃圾数据,例如随机数和大写字母。

【问题讨论】:

U 是一个宏,其含义见这里:microsoft.github.io/cpprestsdk/basic__types_8h_source.html 【参考方案1】:

如果我没记错的话,你的其他 api 文档在这个 url 下:

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

正如你在上面看到的,这个命名空间:utility::conversions,提供了各种对你有用的转换函数。示例:

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

如果你想让你的名字由 wchar_t 字符组成,那么上面的命名空间还包含 utf16string 参数的重载。从这个网站:

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

您可以了解到utf16string 总是尝试成为两个字节字符的字符串。在 windows 下应该是 typedef std::wstring utf16string; 而在 linux-es 上可能是 typedef std::u16string utf16string;

【讨论】:

【参考方案2】:

您的尝试 #3 看起来最接近。试试这个:

std::wstring name = L"the_name";
std::string utf8str;
std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> utf8_conv;
for (auto &ch : name) utf8str.append(utf8_conv.to_bytes(ch));

【讨论】:

1>Main.obj:错误 LNK2001:无法解析的外部符号“_declspec(dllimport) public:静态类 std::locale::id std::codecvt::id" (__imp?id@?$codecvt@_UDU_Mbstatet@@@std@@2V0locale@2@A) 是的,应该有 wchar_t 而不是 char32_t。已编辑。

以上是关于C++ 将 wstring 转换为 Unicode的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用最少的代码将字符串转换为 wstring 并返回

如何将string转换成wstring C++

将 String^ 转换为 wstring C++

C++ .NET 将 System::String 转换为 std::string

如何将CString转换成wstring

string和wstring相互转换