Windows API 常需在 ANSI (char*) 與 Unicode (wchar_t*) 之間轉換。直接呼叫 MultiByteToWideChar/WideCharToMultiByte 參數繁多、易忘。封裝為單例工具類,簡化調用。
namespace useful {
class translator {
public:
// 靜態轉換:使用者提供緩衝區
static wchar_t* translate(const char* str, size_t sub, wchar_t buf[], size_t num);
static char* translate(const wchar_t* str, size_t sub, char buf[], size_t num);
// 單例便捷轉換:內部管理緩衝區,回傳指針 (生命週期至下次調用)
const wchar_t* translate(const char* str, size_t sub = npos);
const char* translate(const wchar_t* str, size_t sub = npos);
static translator& instance();
private:
void buffer(size_t len); // 內部緩衝區自動增長
char* m_buf = nullptr;
size_t m_len = 0;
};
}
CP_OEMCP (當前 OEM 代碼頁),亦可改為 CP_UTF8 或 CP_ACP。m_buf 以 char[] 分配,轉 wchar_t* 時用 reinterpret_cast,注意對齊 (分配雙倍大小)。sub == npos 表示處理整串 (含結束符)。instance() 保證執行緒安全 (C++11 靜態區域變數)。auto& tr = useful::translator::instance();
const char* ansi = "Hello";
const wchar_t* wide = tr.translate(ansi); // L"Hello"
const char* back = tr.translate(wide); // "Hello"
// 臨時緩衝區版本 (無單例依賴)
wchar_t wbuf[64];
tr.translate(ansi, 5, wbuf, 64);
std::wstring_convert (C++11/17 deprecated, C++20 removed)MultiByteToWideChar/WideCharToMultiByte 直接呼叫iconv, ICU, Boost.Nowide, fmt (C++20 std::format)std::from_chars/to_chars 僅支援數值轉換本封裝適合 **Windows 專案、輕量依賴、不想引入重型庫** 的場景。