Unicode 与 Ansi的转换代码参考 char* to wchar_t*

cpp文件 aw.cpp

#include "StdAfx.h" #include "aw.h" #include "windows.h" namespace { wchar_t* Ansi2Unicode(const char* szAnsi) { CHECK_RET(!szAnsi, NULL) // 预转换,得到所需空间的大小 int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0); // 分配空间要给'/0'留个空间,MultiByteToWideChar不会给'/0'空间 wchar_t* wszString = new wchar_t[wcsLen+1]; CHECK_RET(!wszString, NULL) ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen); // 最后加上结束符'/0' wszString[wcsLen] = L'/0'; return wszString; } char* Unicode2Ansi(const wchar_t* wszString) { CHECK_RET(!wszString, NULL) int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL); char* szAnsi = new char[ansiLen + 1]; CHECK_RET(!szAnsi, NULL) // Unicode版对应的strlen是wcslen ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL); // 最后加上'/0' szAnsi[ansiLen] = '/0'; return szAnsi; } } chAWTrans::chAWTrans(const char* szAnsi) : m_szAnsi(NULL) { m_wszString = Ansi2Unicode(szAnsi); } chAWTrans::chAWTrans(const wchar_t* wszString) : m_wszString(NULL) { m_szAnsi = Unicode2Ansi(wszString); } chAWTrans::~chAWTrans(void) { DELEMS(m_szAnsi) DELEMS(m_wszString) } chAWTrans::operator char* () { if (!m_szAnsi && m_wszString) { m_szAnsi = Unicode2Ansi(m_wszString); } return m_szAnsi; } chAWTrans::operator wchar_t* () { if (!m_wszString && m_szAnsi) { m_wszString = Ansi2Unicode(m_szAnsi); } return m_wszString; }

 

头文件 aw.h

#pragma once class chAWTrans { public: chAWTrans(const char* szAnsi); chAWTrans(const wchar_t* wszString); ~chAWTrans(void); operator char* (); operator wchar_t* (); private: char* m_szAnsi; wchar_t* m_wszString; };

你可能感兴趣的:(Unicode 与 Ansi的转换代码参考 char* to wchar_t*)