char* unicodeToUtf8(const TCHAR *zWideFilename)
{
int nByte;
char *zFilename;
nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0);
zFilename = (char *)malloc(nByte);
if(zFilename == 0)
{
return 0;
}
nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, 0, 0);
if( nByte == 0 )
{
free(zFilename);
zFilename = 0;
}
return zFilename;
}
char* unicodeToMbcs(const TCHAR *zWideFilename) {
int nGb2312Len = WideCharToMultiByte(CP_ACP, 0, zWideFilename, -1, NULL, 0, NULL, NULL);
char *pcGb2312=(char *)malloc(nGb2312Len + 1);//new char[nGb2312Len + 1];
memset(pcGb2312, 0, nGb2312Len + 1);
WideCharToMultiByte(CP_ACP, 0, zWideFilename, -1, pcGb2312, nGb2312Len, NULL, NULL);
return pcGb2312;
}
TCHAR* mbcsToUnicode(const char *zFilename)
{
int nByte;
TCHAR *zMbcsFilename;
int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP;
nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR);
zMbcsFilename = (TCHAR *)malloc(nByte*sizeof(zMbcsFilename[0]));
if( zMbcsFilename==0 )
{
return 0;
}
nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte);
if(nByte == 0)
{
free(zMbcsFilename);
zMbcsFilename = 0;
}
return zMbcsFilename;
}
char* mbcsToUtf8( const char* zFilename )
{
TCHAR* pwFilename = mbcsToUnicode(zFilename);
if(pwFilename == NULL)
return NULL;
char* pUtf8 = unicodeToUtf8(pwFilename);
free(pwFilename);
return pUtf8;
}
char* utf8ToMbcs( const char* zFilename )
{
int nUnicodeLen = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0);
TCHAR * pcUnicode = new TCHAR[nUnicodeLen+1];
memset(pcUnicode, 0, nUnicodeLen * 2 + 2);
//utf8 to unicode
MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, pcUnicode, nUnicodeLen);
//unicode to gb2312
int nGb2312Len = WideCharToMultiByte(CP_ACP, 0, pcUnicode, -1, NULL, 0, NULL, NULL);
char *pcGb2312=(char *)malloc(nGb2312Len + 1);//new char[nGb2312Len + 1];
memset(pcGb2312, 0, nGb2312Len + 1);
WideCharToMultiByte(CP_ACP, 0, pcUnicode, -1, pcGb2312, nGb2312Len, NULL, NULL);
delete[] pcUnicode;
return pcGb2312;
}
TCHAR* utf8ToUnicode(const char *zFilename) {
int nUnicodeLen = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0);
TCHAR * pcUnicode = new TCHAR[nUnicodeLen+1];
memset(pcUnicode, 0, nUnicodeLen * 2 + 2);
//utf8 to unicode
MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, pcUnicode, nUnicodeLen);
return pcUnicode;
}
//Converting a WChar string to a Ansi string
std::string WChar2Ansi(LPCWSTR pwszSrc)
{
int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
if (nLen<= 0) return std::string("");
char* pszDst = new char[nLen];
if (NULL == pszDst) return std::string("");
WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
pszDst[nLen -1] = 0;
std::string strTemp(pszDst);
delete [] pszDst;
return strTemp;
}
std::string ws2s(const std::wstring& ws) {
return WChar2Ansi(ws.c_str());
}
//Converting a Ansi string to WChar string
std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
{
int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
if(nSize <= 0) return NULL;
//printf("size = %d\n", nSize);
TCHAR *pwszDst = new TCHAR[nSize+1];
if( NULL == pwszDst) return NULL;
MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
pwszDst[nSize] = 0;
if( pwszDst[0] == 0xFEFF) // skip Oxfeff
for(int i = 0; i < nSize; i ++)
pwszDst[i] = pwszDst[i+1];
std::wstring wcharString(pwszDst);
delete pwszDst;
return wcharString;
}
std::wstring s2ws(const std::string& s) {
return Ansi2WChar(s.c_str(),s.size());
}