首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 字串轉換封裝類:char* 與 wchar_t* 互轉 (Windows API)

     編輯:關於C++

動機

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);

現代 C++ 替代方案

  • std::wstring_convert (C++11/17 deprecated, C++20 removed)
  • MultiByteToWideChar/WideCharToMultiByte 直接呼叫
  • 第三方庫:iconv, ICU, Boost.Nowide, fmt (C++20 std::format)
  • C++20 std::from_chars/to_chars 僅支援數值轉換

本封裝適合 **Windows 專案、輕量依賴、不想引入重型庫** 的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved