事情是这样的,我有几个超大的txt文件,文件内容是几年的英文文章,每篇文章前用横线隔开。每篇文章分为好几部分,每一部分都以中文标签打头后接正文部分。例如“正文:Today bejing ...”或者“出版日期: Dec 21, 2010”。
前半部分是读出utf-8编码,后边函数changeTxtEncoding是将utf-8转换为ANSI格式。这里还学到了两个新问题
要做的任务是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,搞定!!坑爹啊,怎么没想到这一点啊,浪费了好几天都没解决呀,这脑袋还能开心的做程序员么,还能欢快的把妹嘛,不说了,全是泪,让程序自己跑着,我吃饭去了



在处理TXT文件时遇到编码问题,文件部分为UTF-8,部分为ANSI,导致中文乱码。通过读取全部内容再转换解决了UTF-8文件的乱码,但发现一些原本是ANSI编码的文件在转换后乱码。最终通过检查原始文件,手动将所有文件另存为ANSI格式解决了问题。

1万+

被折叠的 条评论
为什么被折叠?



