unicode,ansi编码转换

unicode,和ansi编码转换主要应用WideCharToMultiByte,MultiByteToWideChar,以下是应用方法
BOOL AnsiToUnicode(LPSTR pszA, LPWSTR* ppszW)
{

DWORD cCharacters;

if (NULL == pszA)
{
*ppszW = NULL;
return FALSE;
}

cCharacters = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszA, -1,
0, 0);

*ppszW = (LPWSTR) LocalAlloc(cCharacters*2);//字节长度应该为ANSI的2倍
if (NULL == *ppszW)
return FALSE;

// Unicode转换 -1指定根据'/0'来判断长度,如果'/0'后也需要转换而输入其实际长度
//而输出的unicode长度要为其实际的子串长度,也就是说要WCHAR为单位
if (0 == MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszA, -1,
*ppszW, cCharacters))
{
LocalFree(*ppszW);
return FALSE;
}

return TRUE;
}


BOOL UnicodeToAnsi(LPWSTR pszW, LPSTR* ppszA)
{

DWORD cCharacters;

if (pszW == NULL)
{
*ppszA = NULL;
return FALSE;
}

cCharacters = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, pszW, -1,
  NULL,NULL, NULL, NULL);

//因为是ansi所以字节数就为其个数
*ppszA = (LPSTR) LocalAlloc(cCharacters);
if (NULL == *ppszA)
return FALSE;

//ansi转换.
if (0 == WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, pszW, -1,
*ppszA,cbAnsi, NULL, NULL))
{
LocalFree(*ppszA);
return FALSE;
}
return TURE;
}
记得退出之前LocalFree掉这块内存就ok了.

你可能感兴趣的:(unicode,ansi编码转换)