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

      事情是这样的,我有几个超大的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

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文件ANSI和UTF-8存储格式问题---阿西巴)