LPSTR UnicodeToXEx(DWORD codePage,const LPWSTR source,int size) { if (size == -1) size=lstrlenW(source); int destSize=UnicodeToX(codePage,source,size,NULL,0); if (destSize > 0) { destSize+=sizeof(BYTE); LPSTR dest=(LPSTR)_alloc(destSize*sizeof(BYTE)); if (dest) { UnicodeToX(codePage,source,size,dest,destSize); return dest; } } return NULL; }
SYSLIBFUNC(DWORD) StrUtf8ToAnsi(LPCSTR lpSource,DWORD dwSourceSize,LPSTR lpDest,DWORD dwDestSize) { DWORD dwRet=0; do { DWORD dwUniLen; LPWSTR lpSourceW=StrUtf8ToUnicodeEx(lpSource,dwSourceSize,&dwUniLen); if (!lpSourceW) break; dwRet=UnicodeToX(1251,lpSourceW,dwUniLen,lpDest,dwDestSize);; MemFree(lpSourceW); } while (false); return dwRet; }
SYSLIBFUNC(DWORD) StrUnicodeToUtf8(LPCWSTR lpSource,DWORD dwSourceSize,LPSTR lpDest,DWORD dwDestSize) { DWORD dwRet=0; do { if (!SYSLIB_SAFE::CheckStrParamW(lpSource,dwSourceSize)) break; if (!dwDestSize) dwDestSize=lstrlenW(lpSource)+1; if (!SYSLIB_SAFE::CheckParamWrite(lpDest,dwDestSize)) break; dwRet=UnicodeToX(CP_UTF8,lpSource,dwSourceSize,lpDest,dwDestSize); } while (false); return dwRet; }
SYSLIBFUNC(DWORD) StrUnicodeToAnsi(LPCWSTR lpSource,DWORD dwSourceSize,LPSTR lpDest,DWORD dwDestSize) { DWORD dwRet=0; do { if (!SYSLIB_SAFE::CheckStrParamW(lpSource,dwSourceSize)) break; if (!dwDestSize) dwDestSize=lstrlenW(lpSource)+1; if (!SYSLIB_SAFE::CheckParamWrite(lpDest,dwDestSize)) break; dwRet=UnicodeToX(1251,lpSource,dwSourceSize,lpDest,dwDestSize,WC_COMPOSITECHECK); } while (false); return dwRet; }
SYSLIBFUNC(LPSTR) StrUnicodeToAnsiEx(LPCWSTR lpSource,DWORD dwSourceSize,LPDWORD lpOutSize) { LPSTR lpOut=NULL; do { if (!SYSLIB_SAFE::CheckStrParamsExW(lpSource,dwSourceSize,&lpOutSize)) break; if (!dwSourceSize) { dwSourceSize=lstrlenW(lpSource); if (!dwSourceSize) break; } DWORD dwRequedSize=UnicodeToX(1251,lpSource,dwSourceSize,NULL,0,WC_COMPOSITECHECK); if (!dwRequedSize) break; lpOut=(LPSTR)MemQuickAlloc(dwRequedSize+1); if (!lpOut) break; DWORD dwOutSize=StrUnicodeToAnsi(lpSource,dwSourceSize,lpOut,dwRequedSize); if (dwOutSize) { if (lpOutSize) *lpOutSize=dwOutSize; lpOut[dwOutSize]=0; break; } MemFree(lpOut); lpOut=NULL; } while (false); return lpOut; }
int UnicodeToAnsi(const LPWSTR source,int sourceSize,LPSTR dest,int destSize) { return UnicodeToX(1251,source,sourceSize,dest,destSize); }