VC中实现GB2312、BIG5、Unicode编码转换的方法
本文主要以实例形式讨论了VC编译环境下,实现字符串和文件编码方式转换的方法,在linux下请使用Strconv来实现。具体方法如下:
一、文件编码格式转换
//GB2312编码文件转换成Unicode: if((file_handle=fopen(filenam,"rb"))!=NULL) { //从GB2312源文件以二进制的方式读取buffer numread=fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_handle); fclose(file_handle); //GB2312文件buffer转换成UNICODE nLen=MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,NULL,0); MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,(LPWSTR)str_unicode_buf_pool,nLen); //组装UNICODELittleEndian编码文件文件头标示符"0xFF0xFE" //备注:UNICODEBigEndian编码文件文件头标示符"0xFF0xFE" //LittleEndian与BigEndian编码差异此处不详述 unicode_little_file_header[0]=0xFF; unicode_little_file_header[1]=0xFE; //存储目标文件 if((file_handle=fopen(filenewname,"wb+"))!=NULL) { fwrite(unicode_little_file_header,sizeof(char),2,file_handle); numwrite=fwrite(str_unicode_buf_pool,sizeof(LPWSTR),nLen,file_handle); fclose(file_handle); } }
二、字符串编码格式转换
//GB2312转换成Unicode: wchar_t*GB2312ToUnicode(constchar*szGBString) { UINTnCodePage=936;//GB2312 intnLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0); wchar_t*pBuffer=newwchar_t[nLength+1]; MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength); pBuffer[nLength]=0; returnpBuffer; } //BIG5转换成Unicode: wchar_t*BIG5ToUnicode(constchar*szBIG5String) { UINTnCodePage=950;//BIG5 intnLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0); wchar_t*pBuffer=newwchar_t[nLength+1]; MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength); pBuffer[nLength]=0; returnpBuffer; } //Unicode转换成GB2312: char*UnicodeToGB2312(constwchar_t*szUnicodeString) { UINTnCodePage=936;//GB2312 intnLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL); char*pBuffer=newchar[nLength+1]; WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL); pBuffer[nLength]=0; returnpBuffer; } //Unicode转换成BIG5: char*UnicodeToBIG5(constwchar_t*szUnicodeString) { UINTnCodePage=950;//BIG5 intnLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL); char*pBuffer=newchar[nLength+1]; WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL); pBuffer[nLength]=0; returnpBuffer; } //繁体中文BIG5转换成简体中文GB2312 char*BIG5ToGB2312(constchar*szBIG5String) { LCIDlcid=MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC); wchar_t*szUnicodeBuff=BIG5ToUnicode(szBIG5String); char*szGB2312Buff=UnicodeToGB2312(szUnicodeBuff); intnLength=LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,NULL,0); char*pBuffer=newchar[nLength+1]; LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength); pBuffer[nLength]=0; delete[]szUnicodeBuff; delete[]szGB2312Buff; returnpBuffer; } //简体中文GB2312转换成繁体中文BIG5 char*GB2312ToBIG5(constchar*szGBString) { LCIDlcid=MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC); intnLength=LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0); char*pBuffer=newchar[nLength+1]; LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength); pBuffer[nLength]=0; wchar_t*pUnicodeBuff=GB2312ToUnicode(pBuffer); char*pBIG5Buff=UnicodeToBIG5(pUnicodeBuff); delete[]pBuffer; delete[]pUnicodeBuff; returnpBIG5Buff; }
三、API函数:MultiByteToWideChar参数说明
第一个参数为代码页,用GetLocaleInfo函数获取当前系统的代码页,936:简体中文,950:繁体中文
第二个参数为选项,一般用0就可以了
第三个参数为ANSI字符串的地址,这个字符串是第一个参数指定的语言的ANSI字符串(AnsiString)
第四个参数为ANSI字符串的长度,如果用-1,就表示是用0作为结束符的字符串
第五个参数为转化生成的unicode字符串(WideString)的地址,如果为NULL,就是代表计算生成的字符串的长度
第六个参数为转化生成的unicode字符串缓存的容量,也就是有多少个UNICODE字符。