ANSI、UNICODE、UTF-8编码格式相互之间转换

#include <stdio.h> 
#include <windows.h> 
#include <locale.h> 
#define BUFF_SIZE 1024 

/*ANSI转换到Unicode*/
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; 
} 

/*Unicode转换到ANSI*/
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; 
} 

//UTF8转换到Unicode
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; 
} 

//Unicode转换到UTF8
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; 
}  

//ANSI转换到UTF8
char* ANSIToUTF8(const char* str) 
{ 
	return UnicodeToUTF8(ANSIToUnicode(str)); 
} 

//UTF8转换到ANSI
char* UTF8ToANSI(const char* str) 
{ 
	return UnicodeToANSI(UTF8ToUnicode(str)); 
} 

/*宽字符转换为多字符Unicode - ANSI*/
char* w2m(const wchar_t* wcs) 
{ 
	int len; 
	char* buf; 
	len =wcstombs(NULL,wcs,0); 
	if (len == 0) 
		return NULL; 
	buf = (char *)malloc(sizeof(char)*(len+1)); 
	memset(buf, 0, sizeof(char) *(len+1)); 
	len =wcstombs(buf,wcs,len+1); 
	return buf; 
} 

/*多字符转换为宽字符ANSI - Unicode*/
wchar_t* m2w(const char* mbs) 
{ 
	int len; 
	wchar_t* buf; 
	len =mbstowcs(NULL,mbs,0); 
	if (len == 0) 
		return NULL; 
	buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1)); 
	memset(buf, 0, sizeof(wchar_t) *(len+1)); 
	len =mbstowcs(buf,mbs,len+1); 
	return buf; 
}

int main() 
{ 
	/*使用wcstombs和mbstowcs之前必须调用setlocale,以便决定内码*/
	setlocale(LC_ALL,".936"); 
	/*假定有一个Unicode(UTF-16LE)编码的文件,将其打开,重新编码为ANSI
	,写入aa.txt中,再继续编码回Unicode,写入aw.txt中*/
	/*如果不存在a.txt文件,则程序出错,没有做错误处理*/
	char* filename = "a.txt"; 
	char* filenamea = "aa.txt"; 
	char* filenamew = "aw.txt"; 
	FILE*     input=fopen( filename, "rb"); 
	FILE*     inputa=fopen( filenamea, "wb"); 
	FILE*     inputw=fopen( filenamew, "wb"); 
	wchar_t * buf ; 
	/*BOE设置,UTF-16LE的BOE为FEFF,如果不先将其读取出来,wcstombs会调用失败*/
	fgetwc(input); 
	fputwc(0xFEFF,inputw); 
	/*开始读取文件*/
	while(!feof(input)) 
	{ 
		buf = (wchar_t *)malloc(sizeof(wchar_t)*BUFF_SIZE)         ; 
		memset(buf,    0, sizeof(wchar_t) * BUFF_SIZE ); 
		fgetws(buf,    BUFF_SIZE,    input); 
		fputs(w2m(buf),    inputa); 
		fputws(m2w(w2m(buf)),    inputw); 
	} 
	/*后续处理*/
	fclose(input); 
	fclose(inputa); 
	fclose(inputw); 
	free(buf); 

	return 0; 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值