Add string to wstring conversion helper and related unittest

Bug: dawn:766
Change-Id: I318c630df01fcdb302d36873a783fdf1a39c608c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/48200
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: 陈俊嘉 <cjj19970505@live.cn>
This commit is contained in:
陈俊嘉 2021-04-21 11:05:50 +00:00 committed by Commit Bot service account
parent 9446154d74
commit 672105aa0a
3 changed files with 32 additions and 0 deletions

View File

@ -30,3 +30,16 @@ std::string WCharToUTF8(const wchar_t* input) {
// This will allocate the returned std::string and then destroy result.
return std::string(result.get(), result.get() + (requiredSize - 1));
}
std::wstring UTF8ToWStr(const char* input) {
// The -1 argument asks MultiByteToWideChar to use the null terminator to know the size of
// input. It will return a size that includes the null terminator.
int requiredSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, nullptr, 0);
// When we can use C++17 this can be changed to use string.data() instead.
std::unique_ptr<wchar_t[]> result = std::make_unique<wchar_t[]>(requiredSize);
MultiByteToWideChar(CP_UTF8, 0, input, -1, result.get(), requiredSize);
// This will allocate the returned std::string and then destroy result.
return std::wstring(result.get(), result.get() + (requiredSize - 1));
}

View File

@ -19,4 +19,6 @@
std::string WCharToUTF8(const wchar_t* input);
std::wstring UTF8ToWStr(const char* input);
#endif // COMMON_WINDOWSUTILS_H_

View File

@ -31,4 +31,21 @@ TEST(WindowsUtilsTests, WCharToUTF8) {
// Test three-byte utf8 codepoint
ASSERT_EQ("\xe1\x81\x90", WCharToUTF8(L"\x1050"));
}
TEST(WindowsUtilsTests, UTF8ToWStr) {
// Test the empty string
ASSERT_EQ(L"", UTF8ToWStr(""));
// Test ASCII characters
ASSERT_EQ(L"abc", UTF8ToWStr("abc"));
// Test ASCII characters
ASSERT_EQ(L"abc", UTF8ToWStr("abc"));
// Test two-byte utf8 character
ASSERT_EQ(L"\x450", UTF8ToWStr("\xd1\x90"));
// Test three-byte utf8 codepoint
ASSERT_EQ(L"\x1050", UTF8ToWStr("\xe1\x81\x90"));
}