【零基础学QT】【035】Qt中文读写和打印乱码处理

为什么Qt和很多软件都会有乱码问题

  • 首先,字符串不管是存储到文件还是内存里面,它都只是字节而已,字符字形只是经过转换显示给人看的。同样的字节,在不同的编码下,就代表不同的字符。因此,程序写入文件和读取文件时,使用的编码必须一致
  • 代码编辑器(IDE)在保存和编译源代码时,也是需要知道编码方式的,如果代码保存时使用的编码,和编译器读取代码时使用的编码不一样,也会出现乱码问题。这个道理和上面其实是一样的,编译器本身也是一种程序,代码就是它读取的文件
  • 编辑器显示代码和保存代码时使用的编码可能是不一致的。比如我们指定了IDE的编码方式为ASCII,是不支持中文的,但有可能我们仍然可以输入汉字。因为编译器可能会用Unicode来显示,然后保存的时候,以ASCII来存储。当我们保存后再重启IDE,文件就乱码了。
  • 代码编辑器和代码控制台,也有可能使用的是不同的编码。因为代码编辑器管理的是文件,代码控制台是和cmd进行通信,其实是两种功能
  • 切换编码后,英文和数字不一定会乱码。这是因为英文字母和罗马数字属于国际通用字符,几乎所有的编码格式都包含这些字符,并且和ASCII使用一样的编码值。所以即便切换了编码,它们有可能还是表示同样的字符
  • std::string是以char数组的形式来存储字符的,一个字符占一个字节,而汉字属于宽字符,一个字符占两个字节,因此需要通过转换才能正常打印显示。QDebug和QString自动帮我们封装实现了这些功能,用C++原生代码转换过于麻烦,建议用Qt现成的接口
  • 关于不同编码方式的区别,可以参考这篇博客:https://hellogoogle.blog.csdn.net/article/details/103455674

理想的文件读写方式


	//打印源代码字符串
	//编译器统一使用默认编码,或IDE自动识别源文件编码,无需指定
	string str = "hello";
	print(str);

	//写入文件
	//指定字符编码,或省略编码参数,使用默认编码
	file.write(byte[] buffer, string encoding);
	file.write(string text, string encoding);
	
	//读取文件
	//指定字符编码,或省略编码参数,使用默认编码
	file.setEncoding(string encoding);
	string line= file.readLine();
	string text = file.readAll();

这是一个比较理想,也很容易理解的代码形式。如果字符串可以这样读写,string也可以直接打印,那真是太爽了
在很多Java代码中,字符串的读写就是如此简单。因为代码编辑器和开发框架,都默认使用了UTF8编码,保证了一致性问题
如果不指定编码,那么所有地方默认使用的都是UTF8编码,这样在写代码时,甚至都可以省略编码方式这个参数了
只不过很遗憾,C++毕竟是底层语言(低级语言),封装程度较低,没有一个正式易用的string类型,std::string本质上还是一个char数组,或者说是字节数组,没有字符编码信息。
在做Qt开发时,还是建议所有地方都使用Qt的QString,比较Qt对编码功能进行了封装,当然Qt没有像某些Java框架那样实现完全自动化,还需要我们自己去了解如何使用接口,不过比起原生C++代码,已经算是极其方便了

Qt可以防止中文乱码的一些编码习惯

  • 设置QtCreator代码编辑器编码为UTF8
    【Tools】-【Options】-【Text Editor】-【Behavior】-【Default Encoding】-【UTF-8】
  • 告诉编译器代码文件的编码方式。编译器是不知道IDE代码文件编码方式的,在未明确指定IDE编码方式的情况下,将使用编译器默认的编码方式,而MSVC编译器和MinGW编译器的默认编码方式是不一样,这样就有可能出问题。在未明确指定编码方式的情况下,最终代码是否正确,既取决于文件编码方式,又取决于编译器默认编码方式,就算允许正常,有可能只是偶然,换个编译器可能就乱码了
  • 读写时设置文本流的编码为UTF8
  • 打印文本时使用QDebug和QString

	//指定源文件编码方式
	QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));

    //写文本
    QTextStream out(&file);
    out.setCodec("utf-8");
    out << QString("C++入门到放弃") << endl;

    //读文本
    QTextStream in(&file);
    QString text;
    in.setCodec("utf-8");
    in >> text >> endl;

    //打印文本
    qDebug() << QString("C++入门到放弃") << endl;

QTextCodec::setCodecForCStrings相当于全局设置,如果我们想不同的字符保存为不同的编码格式,也可以使用以下接口

	
	//视str为ASCII编码
	QString QString::fromAscii ( const char * str, int size = -1 )
	//视str为Latin1编码
	QString QString::fromLatin1 ( const char * str, int size = -1 ) 
	//视str为Utf8编码
	QString QString::fromUtf8 ( const char * str, int size = -1 )
	//视str为本地编码,由操作系统默认编码决定
	QString QString::fromLocal8Bit ( const char * str, int size = -1 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值