aboutsummaryrefslogtreecommitdiff
path: root/src/win/string.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/win/string.cpp')
-rw-r--r--src/win/string.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/win/string.cpp b/src/win/string.cpp
new file mode 100644
index 00000000..84906f6b
--- /dev/null
+++ b/src/win/string.cpp
@@ -0,0 +1,46 @@
+#include "cru/win/string.hpp"
+
+#include "cru/win/exception.hpp"
+
+namespace cru::platform::win {
+std::string ToUtf8String(const std::wstring_view& string) {
+ if (string.empty()) return std::string{};
+
+ const auto length =
+ ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, string.data(), -1,
+ nullptr, 0, nullptr, nullptr);
+ if (length == 0) {
+ throw Win32Error(::GetLastError(),
+ "Failed to convert wide string to UTF-8.");
+ }
+
+ std::string result;
+ result.resize(length);
+ if (::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, string.data(), -1,
+ result.data(), static_cast<int>(result.size()),
+ nullptr, nullptr) == 0)
+ throw Win32Error(::GetLastError(),
+ "Failed to convert wide string to UTF-8.");
+ return result;
+}
+
+std::wstring ToUtf16String(const std::string_view& string) {
+ if (string.empty()) return std::wstring{};
+
+ const auto length = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
+ string.data(), -1, nullptr, 0);
+ if (length == 0) {
+ throw Win32Error(::GetLastError(),
+ "Failed to convert wide string to UTF-16.");
+ }
+
+ std::wstring result;
+ result.resize(length);
+ if (::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, string.data(), -1,
+ result.data(),
+ static_cast<int>(result.size())) == 0)
+ throw win::Win32Error(::GetLastError(),
+ "Failed to convert wide string to UTF-16.");
+ return result;
+}
+} // namespace cru::platform::win