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字符。