您的位置:首页 > 其它

txt文件ANSI和UTF-8存储格式问题---阿西巴

2014-07-09 17:19 375 查看
事情是这样的,我有几个超大的txt文件,文件内容是几年的英文文章,每篇文章前用横线隔开。每篇文章分为好几部分,每一部分都以中文标签打头后接正文部分。例如“正文:Today bejing ...”或者“出版日期: Dec 21, 2010”。

要做的任务是1.把这些文章按照每篇且分开,然后2.按照出版日期里的日期命名。当切分开始出现了问题,切分出的文件有部分是以utf-8保存的,这就导致进行第二步操作时出现中文乱码,不能找到“出版日期”,不能忍!!!于是想将第一步获得的切分文件由utf-8转换为ANSI格式。

找了许多方法,终于找到个靠谱的,见代码

int fileNum=0;
findFiles(argv[2],fileNames,fileNum);
for(int i=0;i<fileNum;++i)
{
system("cls");
cout<<fileNames[i]<<endl;
ifstream fin(fileNames[i]);
string name=fileNames[i];
name=name.substr(name.rfind("\\"));

string line,comboLine="";
while(getline(fin,line))
{
comboLine+=line+"\n";
}
char * data=new char[comboLine.length()];
strcpy(data,comboLine.c_str());
char * ansiLine=changeTxtEncoding(data);
ofstream fout(argv[3]+name);
fout<<ansiLine;
fout.clear();
fout.close();
}


char* changeTxtEncoding(char* szU8)
{
int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen + 1];
::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
wszString[wcsLen] = '\0';

int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
char* szAnsi = new char[ansiLen + 1];
::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);
szAnsi[ansiLen] = '\0';
return szAnsi;
}


前半部分是读出utf-8编码,后边函数changeTxtEncoding是将utf-8转换为ANSI格式。这里还学到了两个新问题

1.一开始是读一句转一句,而且使用malloc将string 转换为char * ,这样 出现了末尾换行符乱码(?????),后来换成读出所有内容先new分配空间,然后把c_str() copy进新空间就成了。

2.第二点,我靠,忘了。。。老年痴呆。。。不能忍。。。

后来发现改名后还有许多乱码名字,查了下log发现,出现乱码的文件竟然原来就是ANSI编码,经过我一会转换就变成了乱码,所以经过第一步后还要判断是ANSI还是utf-8编码,我了个去,怎么判断啊,不知道啊?

然后我定睛一想,等下!!为什么有的是ANSI有的是utf-8,拍脑袋一想,我靠,我靠,原来原始的几个超大txt文件有的是utf-8有的是ANSI,8个txt直接手动另存为ANSI,搞定!!坑爹啊,怎么没想到这一点啊,浪费了好几天都没解决呀,这脑袋还能开心的做程序员么,还能欢快的把妹嘛,不说了,全是泪,让程序自己跑着,我吃饭去了






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐