windows编码转换

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());
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值