1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 字符串处理 - ANSI - Unicode - UTF8 转换

字符串处理 - ANSI - Unicode - UTF8 转换

时间:2023-07-31 06:33:31

相关推荐

字符串处理 - ANSI - Unicode - UTF8 转换

字符串处理 - ANSI - Unicode - UTF8 转换

[C语言]字符串处理 - ANSI - Unicode - UTF8 转换 -11-4: 使用MultiByteToWideChar和WideCharToMultiByte写的4个ANSI <-> Unicode <-> UTF-8 相互转换的函数。

-11-5: 使用C语言标准库mbstowcs和wcstombs写的w2m和m2w两个函数,分别对应ANSI <-> Unicode 相互转换。

-11-8: 包装一下 ANSI <-> UTF-8 。 #include <stdio.h>

#include <windows.h>

#include <locale.h>

#define BUFF_SIZE 1024

wchar_t* ANSIToUnicode(constchar* str )

{

inttextlen ;

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

returnresult;

}

char* UnicodeToANSI(constwchar_t* str )

{

char* result;

inttextlen;

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

returnresult;

}

wchar_t* UTF8ToUnicode(constchar* str )

{

inttextlen ;

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

returnresult;

}

char* UnicodeToUTF8(constwchar_t* str )

{

char* result;

inttextlen;

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

returnresult;

}

/*宽字符转换为多字符Unicode - ANSI*/

char* w2m(constwchar_t* wcs)

{

intlen;

char* buf;

len =wcstombs(NULL,wcs,0);

if(len ==0)

returnNULL;

buf = (char*)malloc(sizeof(char)*(len+1));

memset(buf,0,sizeof(char) *(len+1));

len =wcstombs(buf,wcs,len+1);

returnbuf;

}

/*多字符转换为宽字符ANSI - Unicode*/

wchar_t* m2w(constchar* mbs)

{

intlen;

wchar_t* buf;

len =mbstowcs(NULL,mbs,0);

if(len ==0)

returnNULL;

buf = (wchar_t*)malloc(sizeof(wchar_t)*(len+1));

memset(buf,0,sizeof(wchar_t) *(len+1));

len =mbstowcs(buf,mbs,len+1);

returnbuf;

}

char* ANSIToUTF8(constchar* str)

{

returnUnicodeToUTF8(ANSIToUnicode(str));

}

char* UTF8ToANSI(constchar* str)

{

returnUnicodeToANSI(UTF8ToUnicode(str));

}

intmain()

{

/*使用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);

return0;

} 来自:/end/blog/item/9ff286df5d57bc53cdbf1ab9.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。