ANSI和UNICODE互转,微软提供,无BUG

https://support.microsoft.com/en-us/kb/138813

/*
* AnsiToUnicode converts the ANSI string pszA to a Unicode string
* and returns the Unicode string through ppszW. Space for the
* the converted string is allocated by AnsiToUnicode.
*/

HRESULT __fastcall AnsiToUnicode( LPCSTR pszA , LPOLESTR * ppszW)
{

                 ULONG cCharacters;
                 DWORD dwError;

                 // If input is null then just return the same.
                 if (NULL == pszA)
                {
                                * ppszW = NULL ;
                                 return NOERROR ;
                }

                 // Determine number of wide characters to be allocated for the
                 // Unicode string.
                cCharacters = strlen( pszA ) + 1;

                 // Use of the OLE allocator is required if the resultant Unicode
                 // string will be passed to another COM component and if that
                 // component will free it. Otherwise you can use your own allocator.
                * ppszW = (LPOLESTR )CoTaskMemAlloc(cCharacters * 2);
                 if (NULL == * ppszW)
                                 return E_OUTOFMEMORY ;

                 // Covert to Unicode.
                 if (0 == MultiByteToWideChar(CP_ACP , 0, pszA, cCharacters,
                                * ppszW , cCharacters))
                {
                                dwError = GetLastError();
                                CoTaskMemFree(* ppszW );
                                * ppszW = NULL ;
                                 return HRESULT_FROM_WIN32(dwError);
                }

                 return NOERROR ;
                 /*
                * UnicodeToAnsi converts the Unicode string pszW to an ANSI string
                * and returns the ANSI string through ppszA. Space for the
                * the converted string is allocated by UnicodeToAnsi.
                */
}

HRESULT __fastcall UnicodeToAnsi( LPCOLESTR pszW , LPSTR * ppszA)
{

                 ULONG cbAnsi, cCharacters;
                 DWORD dwError;

                 // If input is null then just return the same.
                 if (pszW == NULL)
                {
                                * ppszA = NULL ;
                                 return NOERROR ;
                }

                cCharacters = wcslen( pszW ) + 1;
                 // Determine number of bytes to be allocated for ANSI string. An
                 // ANSI string can have at most 2 bytes per character (for Double
                 // Byte Character Strings.)
                cbAnsi = cCharacters * 2;

                 // Use of the OLE allocator is not required because the resultant
                 // ANSI  string will never be passed to another COM component. You
                 // can use your own allocator.
                * ppszA = (LPSTR )CoTaskMemAlloc(cbAnsi);
                 if (NULL == * ppszA)
                                 return E_OUTOFMEMORY ;

                 // Convert to ANSI.
                 if (0 == WideCharToMultiByte(CP_ACP , 0, pszW, cCharacters, * ppszA ,
                                cbAnsi, NULL , NULL ))
                {
                                dwError = GetLastError();
                                CoTaskMemFree(* ppszA );
                                * ppszA = NULL ;
                                 return HRESULT_FROM_WIN32(dwError);
                }
                 return NOERROR ;

}

用法

LPOLESTR pszFileNameW;
AnsiToUnicode(lpszName, &pszFileNameW);
m_list.InsertItem(0, pszFileNameW);

方法2:

char * lpszName = "ABC";
USES_CONVERSION ;
TCHAR *p = A2W (lpszName);

//同样,还有 W2A

方法3

#include <cstdlib>

char * lpszName = "ABC";
TCHAR wszName[32];
mbstowcs(wszName, lpszName, 32);

//UINCODE转ANSI
wcstombs(lpszName, wszName, 32);

本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注