嵌入式Linux上Qt5的中文显示

2019-07-12 16:40发布

Qt5中文显示

Qt5默认源码字符集和执行字符集为UTF8,所以默认情况下只要中文使用的是UTF8编码格式,Qt5都可以识别,当然,如果是其他编码格式的话就需要做一些转换。这里所说的识别是只是第一步,如果需要正常显示的话还需要对应的字体文件,也就是通常的的ttf文件等,这种文件描述了编码和字型之间的对应关系,使程序可以把编码和字型联系起来,进而把要输出的字型通过framebuffer输出,于是我们就看到了相应的文字。

解释了文字实现的过程,再来看看要怎样让Qt5实现中文输出。

先看中文的编码:
查看Qt程序的界面描述文件*.ui,发现文件头开头是
这说明UI中已经使用的是UTF8的编码格式。
查看QtCreator->工具->选项->文本编辑器->行为->文件编码
默认编码选择:UTF8
这样源码字符集就是UTF8编码

只有编码还不够,还要编码可以转换为可见的文字,于是再来看Qt5是否有对应的字体文件:
Qt5默认使用的字体文件都放在/usr/lib/fonts目录下, Qt5支持三种类型的字体,*.ttf(需要freetype支持)、*.pfa、*.qpf.
Fonts目录下有很多字体,默认都是Qt5自带的,除了qpf文件外,都可以使用桌面系统的字体查看器查看,使用字体查看器可以查看其中是否有对中文字体的支持,另外还可以使用应用程序中指定字体的方法检验字体支持:
代码中加入 QApplication a(argc, argv); QFont font("****", 16); a.setFont(font); ****为字体名称;
Qt5自带的字体文件是没有中文支持的。

从桌面系统或网上下载中文字体,例如fangsong.tty(仿宋字体),拷贝到/usr/lib/fonts目录下,先使用: QApplication a(argc, argv); QFont font("fangsong", 16); a.setFont(font); 检验,结果中文字体显示正常,OK,而且是仿宋没错:)

应为Qt5默认并不会首先匹配我们加进去的字体,所有如果程序不指定font,中文还是无法显示。
考虑到嵌入式系统的特殊性,可以在/usr/lib/fonts目录下只放一种字体,例如仿宋、雅黑等,这样一方面可以解决中文显示的问题,又可以减小image大小,两全其美;缺点嘛,程序不能随便用字体了,不过嵌入式嘛:)

Ps:以上同样适用于其他文字

Shell中文显示

Shell终端无法输出中文存在两个原因:
串口查看工具的编码方式不是UTF8,这种问题常见于windows机器上;
板子上的busybox不支持中文编码UTF8输出
对于原因2,解决方法是再编译busybox的使用打开Unicode的support。
为什么我打开了Unicode support 中文还是?????
原因是Busybox默认的UTF8范围只到767,而中文的最大值为U+9FA5,所以还需要修改
Range of supported Unicode characters
将其设为大于U+9FA5的值
同时enable Allow wide Unicode characters on output选项
总结来说,修改内容有 Kernel 需要修改配置如下 File systems ---> DOS/FAT/NT Filesystems ---> (utf8) Default iocharset for FAT -*- Native language support ---> (utf8) Default NLS Option <*> Simplified Chinese charset (CP936, GB2312 <*> NLS UTF-8 make busybox-menuconfig build/package/busybox/busybox-1.22.x.config Busybox修改配置 Busybox Settings ---> [*] Support Unicode (200000) Range of supported Unicode characters [*] Allow wide Unicode characters on output
保存设置,编译
Shel终端可以显示中文了:)