將只有 ASCII 範圍的 wstring 轉換成 string
Windows 的程式,若是 Unicode enabled 的話,預設使用的編碼是 UTF-16,每個字元的型別為 wchar_t
。這樣的字串,無法使用 std::string
處理,必須改用 std::wstring
。但有時候,現有的函式如果只吃 std::string
,而且我們的字串又只包含有 ASCII 定義的字元(也就是只有英文及半型符號)的話,我們就必須把 std::wstring
轉成 std::string
。
有一種比較偷懶的做法:
std::wstring ws(L"Hello");
std::string s(ws.begin(), ws.end());
但是在比較嚴謹的 C++ 編譯器(例如 VS 2022),就會發出警告(因為隱式把 wchar_t
轉換成 char
,可能造成資料流失)。想要避開警告,就必須明確使用 static_cast<>
進行資料轉換。此時就可以利用 std::transform()
來做:
std::wstring ws(L"Hello");
std::string s(ws.size(), 0);
std::transform(ws.begin(), ws.end(), s.begin(), [](wchar_t c){
return static_cast<char>c;
});