摘要:解决嵌入式Linux平台下挂载盘文件名乱码、QT显示乱码问题。
1、解决嵌入式平台下挂载文件名显示乱码
我的方案开发选择采用SD卡/U盘
的方式来加载3D打印模型文件,因此在PC端U盘里的文件的显示是这样的:
将U盘插入到ARM开发板端,然后直接通过mount进行挂载,执行命令如下:
mount /dev/sda4 /mnt/
如下图所示:
我们能够看到在Window PC端的文件在ARM端下却没有办法正常显示,体现在如下几个方面:
- 文件名显示乱码
- 中文无法正常显示
- 文件长度显示出错
出现以上原因是因为没有指定文件系统的类型,我们可以通过加一个参数来指定。我们先在挂载文件之前通过以下命令查看系统硬盘情况和硬盘分区情况:
fdisk -l
如下图所示:
由此可见,我们需要将挂载的类型指定为vfat
。
将以上挂载命令修改为:
mount -t vfat /dev/sda4 /mnt/
执行后可以看到:
这时候文件长度的问题解决了,但是中文却无法正常显示,出现以上原因是因为系统中没有识别到可以使用的中文字符集,这可能是因为默认使用的文件系统编码和文件系统中文件的实际编码不一致造成的。因此,我们需要在mount命令后面加一个指定字符集的参数iocharset
,一般情况下,简体中文是936或者gb2312,而我的开发板文件系统时utf8。将以上挂载命令修改为:
mount -t vfat -o iocharset=utf8 /dev/sda4 /mnt/
执行后可以看到:
此时在ARM端的显示挂载和查看已经显示正常,这是因为我已经在ARM端移植了中文字库。但是在QT端还是没办法将中文显示出来,
2、解决嵌入式Linux下Qt显示中文乱码
出现乱码的原因是因为ARM端的QT不知道采用什么方式去解码,因此我们需要添加解码方式,头文件如下:
#include <QTextCodec>
然后,当我们需要显示文件中的字符串时,按如下方式操作:
/*按照自己平台支持的编解码方式设置,我的是utf-8*/ QTextCodec *codec = QTextCodec::codecForName("utf-8"); /*QString=>QByteArray*/ QByteArray text = data_list_result->at(tmp_for).model_name.toLatin1() ; /*将读取到的数据以utf-8的方式进行解码*/ QString str = codec->toUnicode(text); /*将解码的结果显示到QT控件上来*/ this->model_vector_name->at(tmp_for)->setText(str);
QT读取文件不能显示中文的问题成功解决!
往期精彩
WIFI DTU产品设计与实现(基于STM32F103+QT配置上位机案例设计分享)