C/C++ 各种字符编码字符串的转换 可用于XML文件的字符转化读写 (收集 GBK - UTF8 - Unicode - ANSI )

下文中的所有代码,主要涉及两个<windows.h>中的函数MultiByteToWideChar、WideCharToMultiByte,所以在使用的时候注意#include <windows.h>

-----------GBK - UTF-8转换------------转自http://hi.baidu.com/cenxcen/item/51fbe06d0514180fa1cf0fd3-----------

VS2003(尝试在VC++6.0使用,可行....在VC++6.0,中文XPSP3系统下,用C/C++将中文字串直接二进制写入文件的时候,文本将会以GBK的编码格式存放,但是如果你的XML文档在第一行的声明中显示是使用UTF-8,那么你写入后的XML文件不仅中文乱码,而且中文后面跟随的尾标签也将会无法解析...所以写入前先转化)

//TODO:UTF8转成GBK码
char* Utf8ToGBK(const char* strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0); 
unsigned short * wszGBK = new unsigned short[len+1]; 
memset(wszGBK, 0, len * 2 + 2); 
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len); 
len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); 
char *szGBK=new char[len + 1]; 
memset(szGBK, 0, len + 1); 
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL); 
return szGBK; 
}

//TODO:GBK转成UTF8码
char* GBKToUtf8(const char* strGBK)
{ 
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0); 
unsigned short * wszUtf8 = new unsigned short[len+1]; 
memset(wszUtf8, 0, len * 2 + 2); 
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len); 
len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); 
char *szUtf8=new char[len + 1]; 
memset(szUtf8, 0, len + 1); 
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL); 
return szUtf8; 
}


vs2005

char* Utf8ToGBK(const char* strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0); 
unsigned short * wszGBK = new unsigned short[len+1]; 
memset(wszGBK, 0, len * 2 + 2); 
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszGBK, len); 
len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszGBK, -1, NULL, 0, NULL, NULL); 
char *szGBK=new char[len + 1]; 
memset(szGBK, 0, len + 1); 
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszGBK, -1, (LPSTR)szGBK, len, NULL,NULL); 
return szGBK; 
}

char* GBKToUtf8(const char* strGBK)
{ 
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0); 
unsigned short * wszUtf8 = new unsigned short[len+1]; 
memset(wszUtf8, 0, len * 2 + 2); 
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len); 
len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL); 
char *szUtf8=new char[len + 1]; 
memset(szUtf8, 0, len + 1); 
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, (LPSTR)szUtf8, len, NULL,NULL); 
return szUtf8; 
}

------------ANSI - Unicode - UTF8 转换-------还有很多细节,详见 http://blog.youkuaiyun.com/wangjiyou/article/details/6995698-----------

wchar_t * ANSIToUnicode( const char* str )
{
int textlen ;
wchar_t * result;
textlen = MultiByteToWideChar( CP_ACP, 0, str,-1, NULL,0 ); 
result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t)); 
memset(result,0,(textlen+1)*sizeof(wchar_t)); 
MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen ); 
return result; 
}

char * UnicodeToANSI( const wchar_t* str )
{
char* result;
int textlen;
textlen = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
result =(char *)malloc((textlen+1)*sizeof(char));
memset( result, 0, sizeof(char) * ( textlen + 1 ) );
WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
return result;
}

wchar_t * UTF8ToUnicode( const char* str )
{
int textlen ;
wchar_t * result;
textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 ); 
result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t)); 
memset(result,0,(textlen+1)*sizeof(wchar_t)); 
MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen ); 
return result; 
}

char * UnicodeToUTF8( const wchar_t* str )
{
char* result;
int textlen;
textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
result =(char *)malloc((textlen+1)*sizeof(char));
memset(result, 0, sizeof(char) * ( textlen + 1 ) );
WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值