codecvt


1. Converting between wide and narrow character strings

#include <codecvt>

void convert_wide_to_narrow() {
  std::wstring wstr = L"Hello, world!";  // Wide-character string
  std::codecvt_utf8<wchar_t> utf8_conv;  // UTF-8 codecvt facet
  std::mbstate_t mbs;  // Multibyte state

  // Convert the wide-character string to a narrow-character string
  size_t size = utf8_conv.max_length(wstr.size());  // Get the maximum number of bytes required
  char *str = new char[size];  // Allocate memory for the narrow-character string
  auto res = utf8_conv.out(mbs, wstr.data(), wstr.data() + wstr.size(), str, str + size, mbs);

  if (res == std::codecvt_base::ok) {
    // Conversion successful
    std::cout << str << std::endl;  // Output the narrow-character string
  } else {
    // Conversion failed
    std::cerr << "Conversion failed" << std::endl;
  }

  delete[] str;  // Free the memory allocated for the narrow-character string
}

void convert_narrow_to_wide() {
  std::string str = "Hello, world!";  // Narrow-character string
  std::codecvt_utf8<wchar_t> utf8_conv;  // UTF-8 codecvt facet
  std::mbstate_t mbs;  // Multibyte state

  // Convert the narrow-character string to a wide-character string
  size_t size = utf8_conv.max_length(str.size());  // Get the maximum number of wide characters required
  wchar_t *wstr = new wchar_t[size];  // Allocate memory for the wide-character string
  auto res = utf8_conv.in(mbs, str.data(), str.data() + str.size(), wstr, wstr + size, mbs);

  if (res == std::codecvt_base::ok) {
    // Conversion successful
    std::wcout << wstr << std::endl;  // Output the wide-character string
  } else {
    // Conversion failed
    std::cerr << "Conversion failed" << std::endl;
  }

  delete[] wstr;  // Free the memory allocated for the wide-character string
}

2. Converting between UTF-8 and UTF-16

3. Converting between UTF-32 and UTF-8