因为项目要求从文件中解析出数据然后输出,一开始练数据时什么编码格式都不知道,后来还是拿UltraEdit一个一个试的。发现时GBK。然后输出,好蛋疼,一直乱码,于是就想着是不是需要转一下格式,百度了好久试了好多方法都没有成功。后来又想着是不是C++语言本身有固定的编码格式之类的东东,要是这样那我可怎么搞,难道把C++底层反过来玩一玩。
但是后来我就发现网上好多人都提到过Linux是默认使用utf-8 而windows则默认使用GBK。是不是平台的原因呢?我用的是Mac,Mac内核是Unix的,而Linux也是Unix系的,说不定放在windows下就不会有问题啊~~然后我就把数据读出来写到数组里让我用windows的同学输出一下,于是,我看到了我最想看到的景象。真是太坑爹了。
再贴上一个人家提供的方法吧,但是我没有测试成功。
int gbk2utf8(char *utfstr,const char *srcstr,int maxutfstrlen)
{
if(nullptr==srcstr)
{
printf("1bad parameter\n");
return -1;
}
//首先先将gbk编码转换为unicode编码
if(nullptr==setlocale(LC_ALL,"zh_CN.GBK"))//设置转换为unicode前的码,当前为gbk编码
{
printf("2bad parameter\n");
return -1;
}
int unicodelen=(int)mbstowcs(nullptr,srcstr,0);//计算转换后的长度
if(unicodelen<=0)
{
printf("can not transfer!!!\n");
return -1;
}
wchar_t *unicodestr=(wchar_t *)calloc(sizeof(wchar_t),unicodelen+1);
mbstowcs(unicodestr,srcstr,strlen(srcstr));//将gbk转换为unicode
//将unicode编码转换为utf8编码
if(nullptr==setlocale(LC_ALL,"zh_CN.UTF-8"))//设置unicode转换后的码,当前为utf8
{
printf("3bad parameter\n");
return -1;
}
int utflen=(int)wcstombs(nullptr,unicodestr,0);//计算转换后的长度
if(utflen<=0)
{
printf("can not transfer!!!\n");
return -1;
}
else if(utflen>=maxutfstrlen)//判断空间是否足够
{
printf("dst str memory not enough\n");
return -1;
}
wcstombs(utfstr,unicodestr,utflen);
utfstr[utflen]=0;//添加结束符
free(unicodestr);
return utflen;
}