java xml ansi 转utf-8_字符串处理 - ANSI - Unicode - UTF8 转换

#include

#include

#include

#define BUFF_SIZE 1024

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;

}

/*宽字符转换为多字符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;

}

char* ANSIToUTF8(const char* str)

{

return UnicodeToUTF8(ANSIToUnicode(str));

}

char* UTF8ToANSI(const char* str)

{

return UnicodeToANSI(UTF8ToUnicode(str));

}

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、付费专栏及课程。

余额充值