字符串处理 - ANSI - Unicode - UTF8 转换
来源:互联网 发布:拳击手套 知乎 编辑:程序博客网 时间:2024/05/16 13:03
2008-11-4: 使用MultiByteToWideChar和WideCharToMultiByte写的4个ANSI <-> Unicode <-> UTF-8 相互转换的函数。2008-11-5: 使用C语言标准库mbstowcs和wcstombs写的w2m和m2w两个函数,分别对应ANSI <-> Unicode 相互转换。2008-11-8: 包装一下 ANSI <-> UTF-8 。 #include <stdio.h>#include <windows.h>#include <locale.h>#define BUFF_SIZE 1024wchar_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;}
- 字符串处理 - ANSI - Unicode - UTF8 转换
- 字符串处理 - ANSI - Unicode - UTF8 转换
- 字符串处理 - ANSI - Unicode - UTF8 转换
- 字符串处理 - ANSI - Unicode - UTF8 转换
- 字符串处理 - ANSI - Unicode - UTF8 转换
- 字符串处理 - ANSI - Unicode - UTF8 转换
- [C语言]字符串处理 - ANSI - Unicode - UTF8 转换
- win32 字符串 utf8 unicode ansi相互转换
- Unicode/Ansi/UTF8字符串的处理
- ANSI Unicode,UTF8 转换
- ANSI - Unicode - UTF8 转换
- utf8,unicode ,ansi转换
- unicode,utf8,ansi转换
- ANSI、UTF8、UNICODE 相互转换
- Ansi、Unicode、UTF8字符串之间的转换,wprintf
- Ansi、Unicode、UTF8字符串之间的转换和写入文本文件
- Ansi、Unicode、UTF8字符串之间的转换和写入文本文件
- Ansi、Unicode、UTF8字符串之间的转换和写入文本文件
- Ext.apply详解
- Initialization Parameters
- 关于静态链接库和动态链接库的几个问题
- 排序算法(二):直接选择排序
- Google 地图切片URL地址解析
- 字符串处理 - ANSI - Unicode - UTF8 转换
- NSData 与 NSString,Byte数组,UIImage 的相互转换
- 状态码200,301,302,404,500
- 【Android 开发教程】ListView的基本使用
- 微速(微锐) 与 打码工作
- C++学习笔记
- 老机换新颜 上 archlinux xfce4 截图
- 如何在遍历list,vector,map时删除符合条件的元素
- 黑马程序员——多线程(二)