字符串、wstring 和 u16string 之间的转换

问题描述 投票:0回答:1

我的

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
之间进行转换?

提前谢谢您!

c++ string casting c++20
1个回答
0
投票

严格按照警告消息所述操作:

考虑使用 中的 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.