为什么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 endl;
//打印文本
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?