c++读取UTF8编码文件乱码

我由于需要将某一文件的空行删掉,反正闲着无聊,就准备自己写个代码实现。本来应该就那么几行就可以解决的,结果却发现是乱码。然后,本来几分钟就ok的事,我花了一整个下午的时间才解决。果然写代码才是最好的消磨时间的方法。

解决方案一:把要改的文件另存为ANSI编码就不会乱码。

解决方案二:

string UTF8ToANSI(const char *str)
{
	string res;
	wchar_t *src;//宽字符类型 
	LPSTR lpres;//LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针 
	//执行转换的多字节字符所使用的字符集为UTF8,0表示不使用位标记,待转换的字符串为str,\
	设置-1会自动判断待转换字符串的长度 ,被转换字符串的缓冲区,0表示函数不执行转换
	//函数执行成功返回待转换字符串的缓冲区所需求的宽字符数大小 
	int tmp = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
	src=new wchar_t[tmp+5];
	//函数执行成功返回向缓冲区中写入的宽字符数
	MultiByteToWideChar(CP_UTF8, 0, str, -1, src, tmp);
	//ANSI编码,。。。,后两个参数可以忽略掉,就用NULL就好 
	tmp = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL);
	lpres=new char[tmp+5];
	WideCharToMultiByte(CP_ACP, 0, src, -1, lpres, tmp, NULL, NULL);
	res=lpres;
	delete []src;
	delete []lpres;
	return res;
}

所以说,还是改文件编码格式要简单的多。

加个彩蛋,使用scanf读取一整行的方法

scanf("%[^\n]",&str[0]);

所以说scanf可以用正则?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值