文件读写字符乱码的解决方案

         关于字符乱码,可能很多人在实际的开发过程中都会遇到。要解决它,既是一个简单的问题,又是一个复杂的问题。

         简单是因为只要编码方式选对就可以从容的解决它,复杂也是复杂在编码方式的选择这里。

         对于ANSI编码的文件,只需要按照常规的读写方法就行,而对于UNICODE编码的文件,需要用宽字符串来接受读取的内容,或者通过常规字符串读取后通过API 函数MultiByteToWideChar()把常规字符串转换成宽字符串即可。

         但是对于UTF-8编码的文件,却不是这么容易处理了,很容易出现乱码。

         解决放案:

         以二进制方式或文本方式打开文件,读文件的时候要用常规字符串来接受返回的文件流,然后再通过函数:MultiByteToWideChar()把UTF-8编码的字符串流转换成宽字符的形式,这样子才不会乱码。如果一开始就用宽字符的字符串流读取,那么就会出现乱码,利用函数:WideCharToMulitiByte()转换后依然是乱码。  

         如果读写的对象是宽字符,还要进行本地语言的设置,比较麻烦,需要在不同的语言之间不停地转来转去。所以最后就是同意转换成常规字符串的形式,牺牲点效率换来编程上面的便利。


贴上代码:

#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>

using namespace std;

int main()
{
	//locale(CP_ALL,"");
	
	string str;
	wstring wstr;
	char *p ;
	wchar_t *wp;
	int length;

	//文件类型为:UTF-8。
	ifstream inFile("utfFile.txt");
	//ifstream inFileT("utfFile.txt", ios::binary );
	if(inFile.fail())
		cout<<"file open error,multi"<<endl;
	p = new char[1024 +1];
	memset( p, 0, 1025 );

	//文件读取。文本
	inFile.read( p, 1024 );

	//编码转换: 转换成宽字符
	length = MultiByteToWideChar( CP_UTF8, 0, p, 1024, NULL, 0 );
	wp = new wchar_t[length];
	memset(wp, 0, length );
	MultiByteToWideChar( CP_UTF8, 0, p, 1024, wp, length );
	
        //转换回常规字符:
	length = WideCharToMultiByte( CP_ACP, 0, wp, -1, NULL, 0, NULL, NULL );
        delete[] p; 
        p = new char[length];
	length = WideCharToMultiByte( CP_ACP, 0, wp, -1, p, length, NULL, NULL );
	//写入文件:
	
	ofstream outFileB( "outFile_binary.txt", ios::binary );
	ofstream outFileT( "outFile_text.txt" );

	outFileB.write( p, length );
	outFileT.write( p, length );
        
        delete[] p;
        delete[] wp;
       //控制台输出:
	system("pause");
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值