Skip to content
Snippets Groups Projects
string.cc 1.27 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <vereign/core/string.hh>
    
    #include <iostream>
    
    #ifdef _WIN32
    # include <windows.h>
    # include <stringapiset.h>
    #endif
    
    namespace vereign::string {
    
    #ifdef _WIN32
    
    
    auto widen(std::string_view utf8_str) -> std::wstring {
    
      if (utf8_str.empty()) {
        return L"";
      }
    
      int num_chars = MultiByteToWideChar(CP_UTF8 , 0, utf8_str.data(), utf8_str.length(), nullptr, 0);
      if (num_chars == 0) {
        return std::wstring{};
      }
    
      std::wstring result;
      result.resize(num_chars);
      num_chars = MultiByteToWideChar(
        CP_UTF8,
        0,
        utf8_str.data(),
        utf8_str.length(),
        result.data(),
        num_chars
      );
    
      if (num_chars == 0) {
        return L"";
      }
    
      return result;
    }
    
    
    auto narrow(std::wstring_view utf16_str) -> std::string {
    
      if (utf16_str.empty()) {
        return "";
      }
    
      int num_chars = WideCharToMultiByte(
        CP_UTF8,
        0,
        utf16_str.data(),
        utf16_str.length(),
        nullptr,
        0,
        nullptr,
        nullptr
      );
    
      if (num_chars == 0) {
        return "";
      }
    
      std::string result;
      result.resize(num_chars);
      num_chars = WideCharToMultiByte(
        CP_UTF8,
        0,
        utf16_str.data(),
        utf16_str.length(),
        result.data(),
        num_chars,
        nullptr,
        nullptr
      );
    
      if (num_chars == 0) {
        return "";
      }
    
      return result;
    }
    
    #endif
    
    } // vereign::string