您的位置:首页 > 其它

关于Unicode&UTF-8&ANSI的相互转换(Ver1.1)

2014-04-04 09:38 465 查看

Ver1.1

原因

Ver1.0的函数用起来总是很麻烦,先要定义一个pTarget的指针,然后将起地址传进来,更方便的写法是pTarget = fun(char*)的形式,但是为了兼容以前的代码,修改为以下:

代码

wchar_t* AnsiToUnicode(char* pSrc, wchar_t** ppTarget /* = NULL */)
{
if (!pSrc)
return NULL;

int wcsLen = ::MultiByteToWideChar(CP_ACP, 0, pSrc, strlen(pSrc), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_ACP, NULL, pSrc, strlen(pSrc), wszString, wcsLen);
wszString[wcsLen] = '\0';
if (NULL != ppTarget)
*ppTarget = wszString;

return wszString;
}

char* UnicodeToAnsi(wchar_t* pSrc, char** ppTarget /* = NULL */)
{
if (!pSrc)
return NULL;

int aLen = ::WideCharToMultiByte(CP_ACP, 0, pSrc, wcslen(pSrc), NULL, 0, NULL, NULL);
char* pChar = new char[aLen + 1];
::WideCharToMultiByte(CP_ACP, 0, pSrc, wcslen(pSrc), pChar, aLen, NULL, NULL);
pChar[aLen] = '\0';
if (NULL != ppTarget)
*ppTarget = pChar;

return pChar;
}

wchar_t* Utf8ToUnicode(char* pSrc, wchar_t** ppTarget /* = NULL */)
{
if (!pSrc)
return NULL;

int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, pSrc, strlen(pSrc), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_UTF8, NULL, pSrc, strlen(pSrc), wszString, wcsLen);
wszString[wcsLen] = '\0';
if (NULL != ppTarget)
*ppTarget = wszString;

return wszString;
}

char* UnicodeToUtf8(wchar_t* pSrc, char** ppTarget /* = NULL */)
{
if (!pSrc)
return NULL;

int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, pSrc, wcslen(pSrc), NULL, 0, NULL, NULL);
char* szU8 = new char[u8Len + 1];
::WideCharToMultiByte(CP_UTF8, NULL, pSrc, wcslen(pSrc), szU8, u8Len, NULL, NULL);
szU8[u8Len] = '\0';
if (NULL != ppTarget)
*ppTarget = szU8;

return szU8;
}


 

Ver1.0

void AnsiToUnicode(char* pSrc, wchar_t** ppTarget)
{
if (!pSrc)
return;

int wcsLen = ::MultiByteToWideChar(CP_ACP, 0, pSrc, strlen(pSrc), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_ACP, NULL, pSrc, strlen(pSrc), wszString, wcsLen);
wszString[wcsLen] = '\0';
*ppTarget = wszString;
}

void UnicodeToAnsi(wchar_t* pSrc, char** ppTarget)
{
if (!pSrc)
return;

int aLen = ::WideCharToMultiByte(CP_ACP, 0, pSrc, wcslen(pSrc), NULL, 0, NULL, NULL);
char* pChar = new char[aLen + 1];
::WideCharToMultiByte(CP_ACP, 0, pSrc, wcslen(pSrc), pChar, aLen, NULL, NULL);
pChar[aLen] = '\0';
*ppTarget = pChar;
}

void Utf8ToUnicode(char* pSrc, wchar_t** ppTarget)
{
if (!pSrc)
return;

int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, pSrc, strlen(pSrc), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_UTF8, NULL, pSrc, strlen(pSrc), wszString, wcsLen);
wszString[wcsLen] = '\0';
*ppTarget = wszString;
}

void UnicodeToUtf8(wchar_t* pSrc, char** ppTarget)
{
if (!pSrc)
return;

int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, pSrc, wcslen(pSrc), NULL, 0, NULL, NULL);
char* szU8 = new char[u8Len + 1];
::WideCharToMultiByte(CP_UTF8, NULL, pSrc, wcslen(pSrc), szU8, u8Len, NULL, NULL);
szU8[u8Len] = '\0';
*ppTarget = szU8;
}


使用完成后需在函数外单独释放pTarget
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: