txt文件ANSI和UTF-8存储格式问题---阿西巴
2014-07-09 17:19
375 查看
事情是这样的,我有几个超大的txt文件,文件内容是几年的英文文章,每篇文章前用横线隔开。每篇文章分为好几部分,每一部分都以中文标签打头后接正文部分。例如“正文:Today bejing ...”或者“出版日期: Dec 21, 2010”。
要做的任务是1.把这些文章按照每篇且分开,然后2.按照出版日期里的日期命名。当切分开始出现了问题,切分出的文件有部分是以utf-8保存的,这就导致进行第二步操作时出现中文乱码,不能找到“出版日期”,不能忍!!!于是想将第一步获得的切分文件由utf-8转换为ANSI格式。
找了许多方法,终于找到个靠谱的,见代码
前半部分是读出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,搞定!!坑爹啊,怎么没想到这一点啊,浪费了好几天都没解决呀,这脑袋还能开心的做程序员么,还能欢快的把妹嘛,不说了,全是泪,让程序自己跑着,我吃饭去了
要做的任务是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,搞定!!坑爹啊,怎么没想到这一点啊,浪费了好几天都没解决呀,这脑袋还能开心的做程序员么,还能欢快的把妹嘛,不说了,全是泪,让程序自己跑着,我吃饭去了
相关文章推荐
- UIWebView加载ANSI格式的txt文件出现乱码问题解决
- 解决python ConfigParser文件编码问题(按指定格式存储文件(txt))
- 解决python ConfigParser文件编码问题(按指定格式存储文件(txt))
- 把ANSI格式的TXT文件批量转换成UTF-8文件类型
- 把ANSI格式的TXT文件批量转换成UTF-8文件类型
- c#读写ANSI格式文件,解决中乱码问题最简单的写法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”的解决方案
- c#读写ANSI格式文件,解决中乱码问题最简单的写法
- UTF-8文件编码格式中有无签名问题汇总《转》
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- ANSI和UTF-8格式文件的区别
- 记事本TXT中文默认保存的ANSI格式文件乱码,一些软件菜单乱码,右键菜单某些乱码
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决
- TXMLDOCUMENT读取UTF-8格式XML文件乱码问题
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- UIWebView加载txt格式文件乱码问题解决
- UTF-8 ANSI Unicode Unicode big endian 乱码 文件格式 文件头
- c#读写ANSI格式文件,解决中乱码问题最简单的写法