我的
C++
模块从NodeJS(node-addon-api)接收一个JSON字符串,然后我使用rapidjson
来处理数据,这需要const char*
。
但是,对于某些功能(请参阅我的上一个问题),我需要数据为
wstring
或u16string
。
无论哪种方式,我都需要一种在
std::string
/ const char*
和 std::u16string
/ const char16_t*
之间进行转换的方法。我上网查了一下,问了AI。大多数情况下,建议是这样的:
std::wstring convert_to_wstring(const std::string& str) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> conv;
return conv.from_bytes(str);
}
std::string convert_from_wstring(const std::wstring& wstr) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> conv;
return conv.to_bytes(wstr);
}
但是,Visual Studio 2022 抱怨这已被弃用:
警告 STL4017: std::wbuffer_convert、std::wstring_convert 和标头(包含 std::codecvt_mode、std::codecvt_utf8、std::codecvt_utf16 和 std::codecvt_utf8_utf16)在 C++17 中已弃用。 (std::codecvt 类模板并未弃用。)C++ 标准不提供等效的未弃用功能;考虑使用
中的 MultiByteToWideChar() 和 WideCharToMultiByte() 来代替。
我尝试过,(例如来自这个SO线程),但也无法让它工作。
那么,如何使用
string
在 u16string
和 wstring_convert
without之间进行转换?
提前谢谢您!
严格按照警告消息所述操作:
考虑使用
中的 MultiByteToWideChar() 和 WideCharToMultiByte() 来代替。
您可以使用
CP_UTF8
作为它们的代码页。它们工作得很好。
std::wstring convert_to_wstring(const std::string& str) {
int str_len = static_cast<int>(str.size());
int wstr_len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str_len, nil, 0);
std::wstring wstr(wstr_len, L'\0');
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str_len, wstr.data(), wstr_len);
return wstr;
}
std::string convert_from_wstring(const std::wstring& wstr) {
int wstr_len = static_cast<int>(wstr.size());
int str_len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr_len, nil, 0, nil, nil);
std::string str(str_len, '\0');
WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr_len, str.data(), str_len, nil, nil);
return str;
}