Qt字库的移植(使其很好的显示中文)

合集下载

QT5实现语言国际化(中英文界面动态切换超详细)

QT5实现语言国际化(中英文界面动态切换超详细)

QT5实现语言国际化(中英文界面动态切换超详细)QT是一款用于构建跨平台应用程序的开发框架,它支持多种编程语言,包括C++。

在QT中实现语言国际化,可以让我们的应用程序在不同语言环境下展示不同的界面文本和信息,以达到更好的用户体验。

本文将详细介绍如何在QT5中实现语言国际化,并提供一个示例。

首先,为了实现语言国际化,我们需要准备好多个翻译文件,每个文件对应一种语言。

这些文件使用Qt Linguist工具生成,可以通过以下命令创建一个翻译文件:```lupdate [项目文件] -ts [输出文件]```其中,[项目文件]是你的QT项目文件,[输出文件]是生成的翻译文件。

接下来,在QT项目中引入翻译文件。

我们可以通过以下代码将翻译文件加载到应用程序中:```cppQTranslator translator;translator.load("翻译文件路径");app.installTranslator(&translator);```在这段代码中,我们首先创建了一个QTranslator对象,然后使用load(函数加载翻译文件,最后通过installTranslator(函数将翻译文件安装到应用程序中。

假设我们的QT项目是一个简单的窗口应用程序,界面上有一个按钮,点击按钮可以切换语言。

首先,我们需要在界面上添加一个按钮,并为其添加槽函数。

槽函数的实现如下:```cppvoid MainWindow::changeLanguageQFileDialog dialog(this);dialog.setNameFilter("Translation files (*.qm)");dialog.setFileMode(QFileDialog::ExistingFile);if (dialog.exec()QString fileName = dialog.selectedFiles(.first(;QTranslator *translator = new QTranslator(this);if (translator->load(fileName))qApp->installTranslator(translator);}}```在这个槽函数中,我们首先创建了一个QFileDialog对象,用于选择翻译文件。

Qt4.7移植

Qt4.7移植

1.移植tslib1.4.11.编译安装./autogen.sh./configure --host=arm-linux -disable-hp3600 --disable-arctic2 --disable-mk712 --disable-collie --disable-corgi --disable-ucb1x00 --disable-linear-h2200 --with-gnu-ld --prefix=/home/lengyuegg/tool/tslib ac_cv_func_malloc_0_nonnull=yesmakemake install2.修改tslib文件/home/lengyuegg/tool/tslib/etc/ts.conf去掉下面一行前的注释module_raw input3.下载到开发板把第一步生成的tslib整个文件下载到开发板随便放到开发板的某个目录下比如放到/home/lengyuegg/tslib4.验证cd /home/lengyuegg/tslib/bin./ts_calibrate2.移植Qt4.7.31.安装arm-linux-gcctar zxvf arm-linux-gcc-4.3.2.tgz把目录下的bin所在的路径加到环境变量里2.编译安装Qt./configure -embedded arm -release -opensource -silent -qt-libpng -qt-libjpeg -qt-libmng -qt-libtiff -no-multimedia -make libs -nomake tools -nomake examples -nomake docs -make demos -qt-kbd-linuxinput -xplatform qws/linux-arm-g++ -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-qt3support -no-nis -no-cups -no-iconv -no-dbus -no-openssl -fast -no-accessibility -no-scripttools -no-mmx -no-multimedia -svg -no-webkit -no-3dnow -no-sse -no-sse2 -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -no-glib -prefix /home/lengyuegg/Qt/Qt4.7.3-qt-mouse-tslib -I /home/lengyuegg/tool/tslib/include-L /home/lengyuegg/tool/tslib/libType '3' to view the GNU General Public License version 3.Type 'L' to view the Lesser GNU General Public License version 2.1.Type 'yes' to accept this license offer.Type 'no' to decline this license offer.yes生成Makefilemake (2个小时)make install3.字体设置复制wqy-zenhei.ttc到/home/lengyuegg/Qt/Qt4.7.3/lib/fonts目录下,这样中文就可显示正常了。

qt5中文输入设置

qt5中文输入设置

/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so
将该文件复制到
qt安装目录//Tools/QtCreator/bin/plugins/platforminputcontexts

qt安装目录/5.3/gcc_64/plugins/platforminputcontexts

重新打开 QtCreator,终于可以输入中文了。
ibus的操作方法与这类似
后记:后来,我发现很多qt编写的程序无法输入中文,将fcitx-frontend-qt5复制到该程序相应的目录下,就可以正常了,如wps和linux 下的代码阅读软件 understand,用这种方法都解决了输入法无法输入中文的问题
想必是qt版本的原因吧。
后来,试着将从源中安装的fcitx-frontend-qt5复制到Qt安装目录下,竟然可以了。
方法如下(fcitx输入法):
1.安装fcitx-frontend-qt5
2.将安装后的fcitx-frontend-qt5复制到qt安装目录
通常,fcitx-frontend-qt5在下面的目录路径中(可用命令dpkQt 5.3.1 下的QtCreator fcitx,ibus不能输入中文
分类: Linux 2014-08-13 15:27 2924人阅读 评论(11) 收藏 举报
qt5qtcreatorqt输入法fcitx qt5.3.2 无法输入中文
ubuntu 14.04从Qt官网下载的最新版qt,安装过程很顺利,但却发现没办法输入中文(我用的是 fcitx), 即使下载了fcitx-frontend-qt5和fcitx-frontend-qt4也还是没用。

Qt移植学习之路 QT4.5.3至mini2440

Qt移植学习之路 QT4.5.3至mini2440

Qt移植学习之路 QT4.5.3至mini2440(1)本文介绍的是Qt移植学习之路QT4.5.3至mini2440,终于成功移植QT 4.5.3至mini2440,并能运行QT自带的应用程序,总得来说还算很顺利,下面是我移植的全部过程。

首先,我交待一下我的开发环境:宿主机:Fedora9主机Gcc:gcc 版本 4.3.0 20080428 (Red Hat 4.3.0-8) (GCC)交叉编译器:arm-linux-gcc-4.3.2 (友善光盘自带)开发板:mini2440(NAND 128M SDRAM 64M)移植步骤:1.准备源码包从ftp:///qt/source/ 下载:qt-embedded-linux-opensource-src-4.5.3.tar.gz和qt-x11-opensource-src-4.5.3.tar.gz前者是移植到开发板上运行的,后者是方便在X86机上开发应用程序,待一切调试成功再经交叉编译后下载到开发板上运行。

从网上下载tslib-1.4.tar.gz包,这包用于管理触摸屏,例如可用于它来校正触摸屏,并保存校正数据。

2.编译安装tslib-1.4把tslib-1.4 COPY到Fedora9的 /opt下,在Fedora9的终端下执行:1.#cd/tmp2.#tarzxvftslib-1.4.tar.gz――――――――(最后在/tmp下解压生成tslib)3.#cdtslib4.#./autogen.sh5.#./configure--prefix=/home/mytslib/--host=arm-linuxac_cv_func_malloc_0_nonnull=yes6.#make7.#makeinstall成功后可在/home下生成mytslib,进入mytslib可以看到有bin include lib etc 四个文件夹。

我们暂时先不理它,在接下来的移植过程中才用到这些文件夹。

QT中文 乱码解决

QT中文 乱码解决

QString 与中文问题2010-07-11 17:04(更新:本文的姊妹篇Qt中translate、tr关系与中文问题 )首先呢,声明一下,QString 是不存在中文支持问题的,很多人遇到问题,并不是本身 QString 的问题,而是没有将自己希望的字符串正确赋给QString。

很简单的问题,"我是中文"这样写的时候,它是传统的 char 类型的窄字符串,我们需要的只不过是通过某种方式告诉QString 这四个汉字采用的那种编码。

而问题一般都出在很多用户对自己当前的编码没太多概念,于是一个简单的 Qt 程序下面这个小程序,估计大家会感到比较亲切。

似乎有相当多的中文用户尝试写过这样的代码:#include <QtGui/QApplication>#include <QtGui/QLabel>int main(int argc, char **argv){QApplication app(argc, argv);QString a= "我是汉字";QLabel label(a);label.show();return app.exec();}编码,保存,编译,运行,一切都很顺利,可是结果呢:出乎意料,界面上中文没显示出来,出现了不认识字符。

于是开始用搜索引擎搜索,开始上论坛发帖或抱怨最后被告知,下面的语句之一可以解决问题:两条指令挨个一试,确实可以解决(多数用户是第一条,其他用户是第二条)。

那么,为什么会这样呢?两种乱码什么时候出现对这个问题,我想大家可能都有话说。

在继续之前,我们先列个表,看看两种乱码分别在那种情况下出现:我们只列举大家最常用的3个编译器(微软VS的中的cl,Mingw中的g++,Linux 下的g++),源代码分别采用GBK和不带BOM的UTF-8 以及带BOM的UTF-8 这3中编码进行保存。

采用3种不同编码保存的源代码文件,分别用3种不同的编译器编译,形成9种组合,除掉一种不能工作的情况,两种乱码出现的情况各占一半。

QT中文显示

QT中文显示

Qt国际化编程解决汉字显示方块、乱码问题Qt 自从版本(2.2.4)以来,实际上就对国际化的支持已经相当完善。

在文本显示上,Qt 使用了Unicode 作为内部编码,可以同时支持多种编码。

为Qt 增加一种编码的支持也比较方便,只要增加该编码和Unicode的转换编码便可以了。

Qt 目前支持ISO标准编码ISO 8859-1,ISO 8859-2,ISO 8859-3,ISO 8859-4,ISO 8859-5,ISO 8859-7,ISO 8859-9,和ISO 8859-15(对于阿拉伯语和希伯来语的支持正在开发之中),中文GBK/Big5,日文eucJP/JIS/ShiftJIS,韩文eucKR,俄文KOI8-R。

当然也可以直接使用UTF8编码。

Qt 使用了自己定义的Locale机制,在编码支持和信息文件(Message File)的翻译上弥补了目前Unix 上所普遍采用Locale和gettext的不足之处。

Qt 的这种机制可以使Qt 的同一组件(QWidget)上同时显示不同编码的文本。

比如,Qt 的标签上可以同时使用中文简体和中文繁体文本。

在文本输入上,Qt 采用了XIM(X Input Method)标准协议,可以直接使用XIM输入服务器。

由于目前的绝大多数输入服务器都是针对单一语言的,所以在Qt 的标准输入组件( QLineEdit,QMultiLineEdit)中的输入受到单一编码的限制,Qt 还不支持动态切换编码输入的支持,这是它的不足之处。

Qt 的文本显示使用Qt 编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。

比如要编写一中文界面的Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取出来翻译。

这样,程序还可以根据Locale的不同,支持多种语言。

下面介绍如何在Qt 程序中标注字符串,如何提取并翻译文本。

像普通的国际化过程一样,Qt 使用了类似GNU gettext一样的函数QObject::tr(),它用于从Qt的信息文件.qm 中取出信息,这些信息是经过Qt 的工具处理的。

1.Qt字符编码转换(UTF-8转换为GBK)

1.Qt字符编码转换(UTF-8转换为GBK)

1.Qt字符编码转换(UTF-8转换为GBK)字符串编码格式转换很多时候可能需要字符串编码的转换,最近我需要获取⼀段字符串的长度,我strlen() 获取的’你好’ 的字节长度为6 ,我记得每个汉字占⽤2字节,查了⼀下 UTF-8格式汉字(含繁体)占3字节,需要转下码.编码知识Qt常见的两种编码是:UTF-8和GBKUTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。

是⽤以解决国际上字符的⼀种多字节编码,它对英⽂使⽤8位(即⼀个字节),中⽂使⽤24为(三个字节)来编码。

UTF-8包含全世界所有国家需要⽤到的字符,是国际编码,通⽤性强。

UTF-8编码的⽂字可以在各国⽀持UTF8字符集的浏览器上显⽰。

如,如果是UTF8编码,则在外国⼈的英⽂IE上也能显⽰中⽂,他们⽆需下载IE的中⽂语⾔⽀持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。

GBK的⽂字编码是⽤双字节来表⽰的,即不论中、英⽂字符均使⽤双字节来表⽰,为了区分中⽂,将其最⾼位都设定成1。

GBK包含全部中⽂字符,是国家编码,通⽤性⽐UTF8差,不过UTF8占⽤的数据库⽐GBD⼤。

GBK是GB2312的扩展,除了兼容GB2312外,它还能显⽰繁体中⽂,还有⽇⽂的假名。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:GBK、GB2312--Unicode--UTF8UTF8--Unicode--GBK、GB2312在简体中⽂windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使⽤0x80~0xFF范围的2个字节来表⽰1个中⽂字符。

0x00~0x7F 之间的字符,依旧是1个字节代表1个字符。

Unicode(UTF-16)编码则所有字符都⽤2个字节表⽰。

上⾯说了 GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换但是我试了下 utf-8 可以直接转换为 gbkQt中提供了⼀个字符串转码的类 QTextCodecQTextCodec类提供⽂本编码之间的转换。

qt-embedded-3.1.1tslib触摸屏校正 qte3移植 触摸屏支持 中文显示

qt-embedded-3.1.1tslib触摸屏校正 qte3移植 触摸屏支持 中文显示

qt-embedded-3.1.1 tslib触摸屏校正+qte3移植+触摸屏支持+中文显示qt-embedded-3.1.1,觉得应该做个总结第一步利用tslib-1.3生成校正文件:因为qt3在正式开始运行之前需要对触摸屏进行校验,qt3是通过读取/etc/pointercal文件里面的内容进行校正的,但是在此之前我的板子上并没有安装qt环境,更不用说有这个文件了,因此在开始移植qt之前,我需要先利用tslib对触摸屏进行校正以生成相应的校正文件并重新烧入文件系统中。

下面就是编译和使用tslib进行校正的过程过程1、编译cd tslib-1.3export CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc //指定交叉编译器./autogen.sh //生成config文件export PATH=/usr/local/arm/3.3.2/bin:$PATHecho "ac_cv_func_malloc_0_nonnull=yes"&gt;arm-linux.cache./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no如果你触摸屏驱动程序支持ioctl操作,上面的configure操作中的--enable-inputapi=no你可以删除vi src/ts_read_raw.c //修改内容如下****************************************************在make之前,为了支持触摸屏,打开src/ts_read_raw.c文件,查看触摸屏驱动程序数据结构,看与ts_read_raw.c结构中的哪个一样,就将代码中的char*defaulttseventtype="UCB1x00"; 修改为自己板子上对应的驱动结构。

qml font 用法

qml font 用法

qml font 用法QML (Qt Modeling Language) 是一种用于构建用户界面的语言,它使用 Qt 框架提供的各种组件和特性来创建交互式应用程序。

在 QML 中,字体是一个重要的元素,用于显示文本内容。

本篇文章将介绍 QML 中字体的基本用法。

一、字体类型在 QML 中,可以使用不同的字体类型来显示文本内容。

常见的字体类型包括:1. 静态字体:使用静态字体可以在 QML 应用程序中定义固定的字体样式,例如字体大小、字体粗细、字体颜色等。

2. 动态字体:动态字体可以根据应用程序的状态和需求来动态更改字体样式。

可以使用 FontFamily、FontRole 等属性来设置动态字体。

3. 自定义字体:如果应用程序需要使用特殊的字体,可以使用自定义字体。

可以使用 @font-face 规则将字体文件链接到 QML 文件中,并在需要显示文本时使用该字体。

二、设置字体属性在 QML 中,可以使用 Font 对象来设置字体的属性,例如字体大小、字体粗细、字体颜色等。

Font 对象包含以下属性:1. family:指定字体的类型,可以是静态字体、动态字体或自定义字体的名称或路径。

2. style:指定字体的样式,例如 normal、bold、italic 等。

3. variant:指定字体的变体,例如 small-caps、monospace 等。

4. pointSize:指定字体的大小。

5. bold:指定是否使用粗体。

6. italic:指定是否使用斜体。

7. underline:指定是否加下划线。

三、使用 Font 对象在 QML 中,可以使用 Font 对象来设置文本的字体属性。

例如,以下代码将文本的字体大小设置为 16 点,字体粗细设置为 bold,并将文本颜色设置为红色:```qmlText {font: Font { family: "Arial"; pointSize: 16; bold: true }color: "red"text: "Hello, World!"}```四、使用 FontFamily 和 FontRole 属性除了使用 Font 对象外,还可以使用 FontFamily 和 FontRole 属性来设置动态字体的属性。

Qt字库的移植(使其很好的显示中文) 一

Qt字库的移植(使其很好的显示中文) 一

Qt字库的移植(使其很好的显示中文) 一qt字库的移植(使其很好的显示中文)1 如何定制字库(移植字库)需要将至少两个文件赋值到....lib/font目录下1. fontdir 文件。

这个是应用程序寻找当前系统中最合适自己需要的字库的索引;2,需要的字体库文件,一般是多个。

具体移植那一个,看你使用的字库是什么了,。

比如我现在的系统我就是移植的wenquanyi_12pt.bdf就可以了,当然这个比较大。

你也可以用小点的。

我的flash比较大呵呵,懒得折腾。

在程序中需要这样设置:QTextCodec::setCodecForTr(QTextCodec::codecForName(&quot;utf 8&quot;));QTextCodec::setCodecForCStrings(QTextCodec::codecForName(&qu ot;utf8&quot;));设置使用utf-8编码也就是unicode编码了,这样在tr和string 的都是unicode的编码了,根据字库的索引就能对应相应的字符了。

然后设置字体://字体设置QFont font(&quot;wenquanyi&quot;,12,QFont::Bold); //使用wenquanyi字体this-&gt;setFont(font);//这样就设置了字体了,中文一般使用wenquanyi字体就可以了。

很好的。

基础知识介绍:字符编码1、字符必须编码后才能被计算机处理。

计算机使用的缺省编码方式就是计算机的内码。

早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

在这些编码中,中文和英文可以统一的处理,区分中文编码的方法是高字节的最高位为不为0。

GB内码的存储方式始终都是big endian,即高位在前。

2、Unicode是一种字符编码方法,它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。

Qt中文乱码解决思路

Qt中文乱码解决思路

Qt中⽂乱码解决思路最近项⽬中遇到不少的Qt中⽂乱码的问题,主要原因是客户的需求⽐较多,Qt版本有⽤4的版本的也有⽤5的版本,并且还有windows与linux跨平台的需求。

经常出现个问题是windows的解决了,源代码放到linux上编译不通过或者中⽂会乱码,本⽂主要是得出⼀个解决⽅案能解决Qt的中⽂问题,并⽀持不同平台与不同版本。

下⾯我们通过下列场景中的问题来找寻答案:场景1:Qt版本: Qt5.1.0_VS2012操作系统: win7CPP⽂件编码: UTF8—⽆BOM格式CPP部分代码如下:QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));QString strMessage = QString::fromLocal8Bit("我是UTF8编码的⽂件:"));qDebug() << strMessage;试着编译下你会发现编译出错:error C2001: newline in constant为什么呢?因为UTF8分为UTF8-⽆BOM和UTF8-BOMUTF8-BOM其实就是⽐UTF8-⽆BOM多了⼏个字节的⽂件头,⽤于和UTF-16与UTF-32区分的。

⽽:windows识别的UTF8是指UTF-BOM(你可以使⽤记事本另存为UTF8格式后查看)。

因为有中⽂冒号:的存在故此UTF8-⽆BOM⽂件格式使⽤VS的Cl编译器是⽆法识别为UTF8的格式,只能当成ANSI来读取解析编译,故编译出错。

那就有⼈会说那我就把CPP的⽂件格式改为:UTF8—BOM格式。

好,我们来看下个场景场景2:CPP⽂件编码: UTF8—BOM格式CPP部分代码如下:QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));QString strMessage = QString::fromLocal8Bit("我是UTF8编码的⽂件:"));qDebug() << strMessage;编译通过,运⾏你会发现出现了⼀个问题,那就是中⽂乱码了,输出了⼀堆⽆⽤的信息。

Qt5中文乱码解决方法剖析

Qt5中文乱码解决方法剖析

Qt5中文乱码解决方法剖析Qt5 废除了Qt4的一些函数,把中文处理变得简单了,但Qt4已经发展了好久了,网上相对的解决方法相对较多,剖析也较多,但Qt5的却不多。

本人也是刚学Qt,在处理数据库时却被它搞的焦头烂额,无奈只能抽出半天时间研究它。

本人开发环境为Qtcreator + Mingw + windows 7中文旗舰版现贴出代码和.pro再做解释[cpp] view plain copyprint?1.#include <QCoreApplication>2.#include <QDebug>3.#include <iostream>4.#include <QString>5.#include <boost/locale.hpp>ing namespace std;7.int main(int argc, char *argv[])8.{9.QCoreApplication a(argc, argv);10.11.qDebug() << "----------------------------------qDebug() 中文------------------------------";12.qDebug() << "<1> qDebug() 我是中国人";// 正常13.qDebug() << QObject::tr("<2> qDebug() 我是中国人");// Binary14.qDebug() << QObject::tr("<3> qDebug() 我是中国人").toLatin1();//15.qDebug() << QObject::tr("<4> qDebug() 我是中国人").toLatin1().data();//16.qDebug() << QObject::tr("<5> qDebug() 我是中国人").toUtf8();//17.qDebug() << QObject::tr("<6> qDebug() 我是中国人").toUtf8().data();// 正常18.qDebug() << QObject::tr("<7> qDebug() 我是中国人").toLocal8Bit();// binary19.qDebug() << QObject::tr("<8> qDebug() 我是中国人").toLocal8Bit().data();// 乱码转成gbk20.qDebug() << QObject::tr("<9> qDebug() 我是中国人").toStdString().data(); // 正常还是utf821.22.23.qDebug() << "----------------------------------std::cout 中文------------------------------";24.std::cout << "<10> std::cout 我是中国人" << std::endl;// 乱码 utf825.std::cout << QObject::tr("<11> std::cout 我是中国人").toLatin1().data()<< std::endl;//26.std::cout << QObject::tr("<12> std::cout 我是中国人").toUtf8().data()<< std::endl;//乱码 utf8无法识别27.std::cout << QObject::tr("<13> std::cout 我是中国人").toLocal8Bit().data() << std::endl;// 正常已转为 gbk28.std::cout << QObject::tr("<14> std::cout 我是中国人").toStdString() << std::endl;// 乱码29.30.31.qDebug() << "----------------------------------boost 转换中文------------------------------";32.std::string strUtf8 = QObject::tr("我是中国人").toStdString();33.std::cout << "<15> std::cout " << strUtf8 << std::endl; // utf-8 乱码34.qDebug() <<"<16> qDebug() " << strUtf8.c_str();// 正常35.std::string strGbk = boost::locale::conv::between(strUtf 8,"gbk","utf8");// 转Gbk36.37.std::cout <<"<17> std::cout "<< strGbk << std::endl;/ / 正常已转为gbk38.qDebug() <<"<18> qDebug() "<< strGbk.c_str();// 乱码 qt无法直接处理gbk编码,只能处理utf839.40.return a.exec();41.}[css] view plain copyprint?1.#-------------------------------------------------2.#3.# Project created by QtCreator 2015-08-13T08:58:454.#5.#-------------------------------------------------6.7.QT += core8.9.QT -= gui10.11.TARGET = chinese12.CONFIG += console13.CONFIG -= app_bundle14.15.TEMPLATE = app16.17.INCLUDEPATH += D:/SDK/boost_1_57_018.19.LIBS += -LD:/SDK/boost_1_57_0/stage/lib20.21.LIBS += -lboost_locale-mgw49-mt-d-1_5722.LIBS += -liconv23.SOURCES += main.cpp先从操作系统说起吧,windows操作系统是可以更改其支持的字符串编码方式的,在window中文版中,默认是gbk编码,也就是说你新建一个记事本文档,里面就是gbk编码的。

Qt-中文乱码原因以及解决方法

Qt-中文乱码原因以及解决方法

Qt-中⽂乱码原因以及解决⽅法本⽂主要分析了基于windows系统msvc2013编译器的Qt中⽂乱码。

概念字库表:是⼀个系统⽀持的⽂字,符号,数字的集合。

编码字符集(字符集):我们平时所说的字符集就是这个,计算机以⼆进制的形式存储字符,每个字符对应的⼆进制编码不同,⽽编码字符集就是所有编码与字符的映射集合。

例如:在ASCII码的编码字符集中,字母A的编码是65,65的⼆进制就是01000001。

字符编码:不同字符的编码不同,其⼆进制的位数也不同。

为了达到节省空间,解析⽅便等⽬的,出现了多种存储字符编码的⽅式,每种⽅式对应⼀套算法也称字符编码。

例如:Unicode字符集,utf-8,utf-16字符编码。

源⽂件字符集:源⽂件本⾝也是⽂本⽂件,所以源⽂件字符集是指源⽂件保存时采⽤哪种字符编码。

执⾏字符集:可执⾏应⽤程序内使⽤何种字符编码。

编译器会将源码字符集转换为执⾏字符集。

注意:1、当MSVC2013编译程序的时候,会分析源⽂件采⽤何种编码,有BOM标识符则可以正确识别其编码,若没有BOM标识符则认为其使⽤本地字符编码local字符集。

我们使⽤的windows系统本地字符编码为GBK编码。

2、编译器分析出源⽂件字符编码之后,会进⾏解码再编码,将源字符集转码成执⾏字符集。

执⾏字符集⼀般默认为使⽤本地字符编码local 字符集,也可以进⾏设置。

QString显⽰中⽂乱码的原因Qt5中QString内部采⽤unicode字符集,utf-16编码。

构造函数QString::QString(const char *str) 默认使⽤ fromUtf8() 将str所指的执⾏字符集从 utf-8 转码成 utf-16。

由上⾯fromUtf8()可知,QString需要执⾏字符集编码为utf-8,然后以utf-8进⾏解码,再编码为utf-16才能获得正确的字符编码。

显⽰中⽂乱码的原因其实就QString转码⽅式与执⾏字符集不⼀致。

QT中QString与string的转化,解决中文乱码问题

QT中QString与string的转化,解决中文乱码问题
在需要使用中文QString时,先用string写一个,然后转过去就可以啦,例如:
[cpp] view plain copy qlabel->setText(QString(str2qstr(string("支持中文"))));
本文版权归作者和博客园共有欢迎转载但未经作者同意必须保留此段声明且在文章页面明显位置给出原文链接否则保留tring的转化,解决中文乱码问题
在QT中,使用QString输出到控件进行显示时,经常会出现中文乱码,网上查了一圈,发现大部分都是针对QT4增加4条语句:</span> [cpp] view plain copy QTextCodec *codec = QTextCodec::codecForName("UTF-8");
[cpp] view plain copy QString str2qstr(const string str) {
return QString::fromLocal8Bit(str.data()); }
string qstr2str(const QString qstr) {
QByteArray cdata = qstr.toLocal8Bit(); return string(cdata); }
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec);
我使用的是QT5,已经不支持如此设置了,而且这样设置也会存在很多问题。 其实,还有更简单的方法,就是使用我写的如下两个函数:

QT使用QSetting读取配置文件中的中文乱码解决方案

QT使用QSetting读取配置文件中的中文乱码解决方案
接着在程序中使用
QSettings settings("config.ini",QSettings::IniFormat); settings.setIniCodec(QTextCodec::codecForName("UTF-8"));//在此添加编码格式设置(如果INI文件编码为UTF-8则这里设置UTF-8,如果为GB2312,则这里设置GB2312,两者一致),即可读写ini文件中的中文 Q/paras/name").toString();//也可用QString::fromUtf8(settings.value("/paras/name").toByteArray()); 注意:qt的终端 qDebug()<<szSoftName;//终端乱码,需要研究研究??? linux下方案同。
在此添加编码格式设置如果ini文件编码为utf8则这里设置utf8如果为gb2312则这里设置gb2312两者一致即可读写ini文件中的中文qstringszsoftnamesettingsvalueparasname
QT使用 QSetting读取配置文件中的中文乱码解决方案
windows下方案: 首先需要将ini文件改成UTF-8或GB2312编码格式,可以通过notepad++工具实现。然后在配置项中填入中文,如下:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.2.2 BDF字体
BDF(Bitmap Distribution
然后设置字体:
//字体设置
QFont font("wenquanyi",12,QFont::Bold); //使用wenquanyi字体
this->setFont(font);
//这样就设置了字体了,中文一般使用wenquanyi字体就可以了。很好的。
基础知识介绍:
字符编码
只会使用QPF格式的文件,而不会读取其它格式的文件,不管FONTDIR里面的内容是什么。如果有多个QPF文件,应用程序按照大小,家族,黑体和斜体
的顺序查找,即首先查找大小和自己一样的字库,大小无法区分唯一的字库的再看对应的家族,还是无法区分的再看是否黑体,是否斜体。可以参考PC上的字库索
引文件FONTDIR:
字体库:
一般认为,一个汉字的编码就对应着这样的字形,这还是错误的。内码对于字库来说,只是查找字形的索引。如果换成另一个编码标准的字体,同一个字符串就会呈现不同的字形,也就是乱码。
随着GUI的发展,字库逐渐转向TTF.TTF字库的编码标准没有UTF8的
由于工作需要把ttf字体转换成qpf字体,牵扯到了qt的makeqpf工具的使用方法
qt字库的移植(使其很好的显示中文)
1 如何定制字库(移植字库)
需要将至少两个文件赋值到....lib/font目录下1. fontdir 文件。这个是应用程序寻找当前系统中最合适自己需要的字库的索引;2,需要的字体库文件,一般是多个。具体移植那一个,看你使用的字库是什么了,。比如我现在的系统我就是移植的wenquanyi_12pt.bdf就可以了,当然这个比较大。你也可以用小点的。我的flash比较大呵呵,懒得折腾。在程序中需要这样设置:
例如:
-cclib -song -medium -r -normal -jiantizi -16 -160 -75 -75 -c -160 -gb2312 1980 -0
其中,每个段的含义如下:
cclib:制造商
song:字体族,此处表示“宋体”字
medium:字权重(中等),还有bold(粗体)选项
Font)是Apple公司和Microsoft公司共同推出的字体文件格式,随着Windows的流行,已经变成最常用的一种字体文件表示方式。TTF
字体已经成功用在Windows中文版生成汉字字库,此字体采用二次B样条曲线来描述字符轮廓,对字符轮廓的上的点,按顺时针方向从小到大编号,填充部分
在其右边。TTF文件结构分成三个部分:文件名(12Bytes),描述表目录(每个16Bytes),描述表数据。
第一列:字体的名字,就是你在设置字体的时候的字体的名字
第二列: (file)即具体的文件名字
第三列: (renderer)字体的格式,有BDF,TTT,QPF等选择.
第四列: n 表示iitalic,是否为斜体
第五列:weight, 50 = Nomal,75=Bold
第六列: size 120表示12pt
Unicode与GB码不兼容,只与ASCII兼容。
UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码,是由UTF(Unicode transforation format)规范规定的。常见的UTF规范包括UTF-8(就是以8位为单元对UCS进行编码)、UT F-7、UTF-16。
UTF-*和Unicode是同类,就是在编码方式上不同。首先UTF编码后的大小是不一定,不像Unicode编码后的大小是一样的。
对于每一个字,都有一个假想的矩形框,正常情况字是不会超出这个矩形框的,中文属于象形字,不象英文,大小不一致,比如:英文中的f就可能会超出矩形框。
微软把矩形的高度称为EM,实际字符的高度称为BODY.矩形框最原始的坐标系是矩形的中心为原点,但为了实际字体在打印和显示的使用过程中的方便,通常
1.2 几种格式字库的简介
QT支持四种格式的字库(TTF,BDF,PFA/PFB,QPF)(见参考文献[3]),但在产品中,如果直接使用,TTF或PFA/PFB。即让应用
程序在显示的时候再计算点阵,最终的效果并不理想,会发现有些字大,有些字小,而且需要占用非常多的FLASH和内存,速度也有点慢,所以我在此不想过多
saving(default is Latin 1))
—— 摘自参考文献[1]
其中属性file,renderer(BDF,TTF,QPF)和size特别要设置对,其它属性问题不大。还要注意如果在该目录下有QPF的文件,系统
BDF,TTT,QPF等选择。第四列n表示iitalic,表示是否为斜体字。第五列表示weight,其中50表示Normal,75表示Bold。
第六列表示size,例如:120表示12pt。第七列为flags,有下面三个选择:s=smooth(anti-aliased)u
=unicode range when saving (default is Latin 1 a = ASCII range when
时这样的存储空间和计算的时间也就越多。在嵌入程序开发过程中,这往往是不可以接受的,因为嵌入式系统的硬件资源本来就很有限,如果真的这样的话,在显示
过程会很慢。并且如果为了提高速度而减少每英寸中的点数,则字体失真的情况很严重。更加具体的关于,TTF字体的内容可见参考资料[3]。
另外,在Windows下编程,Microsoft实现了让用户对字体操作处理具有透明性,有关字体结构定义见参考文献[4]。
1、

符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体
中文的GB2312和用于繁体中文的big5。在这些编码中,中文和英文可以统一的处理,区分中文编码的方法是高字节的最高位为不为0。GB内码的存储方
第七列flags 有三个选项:s保存)
a (ascii 顺序保存,默认是Latin 1)。
文件中每行都标识一个特定的字库,每个段的含义是:第一列为name,第二列为file,第三列为renderer,相当于字型格式,所以有
式始终都是big endian,即高位在前。
2、
Unicode是一种字符编码方法,它是由国际组织设计,可以容纳全世界所有
语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character
Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。
r:倾斜,R(Roman),I(Italic),O(Oblique)
normal:字符集宽度,此外还有condensed,narrow,double
jiantizi:附加说明(此处意义为“简体字”)
16:用像素衡量的宽度。
160:点数 10
75(1):水平分辨率(dpi)
75(2):垂直分辨率(dpi)
的介绍PFA/PFB。如果直接使用BDF,速度非常慢,而且需要占用比较多的FLASH和内存;使用QPF,速度和占用其它资源是最小的,因此我们最终
的产品中采用QPF格式。下面我简单介绍,TTF,BDF和QPF字体的结构,这样就比较容易理解后面的转换过程。
1.2.1 TTF字体
TTF(TrueType
先简单说一下qt的字体支持
Qte可以支持以下四种形态的字体格式
TrueType (TTF)、Postscript Type(PFA/PFB)、Bitmap Distribution Format fonts(BDF)、Qt Prerendered Font(QPF)
Qt中不同字体是用Unicode来处理、转换
FreeType是一个免费的并且可以被移植的TrueType 字库引擎,可以应用于很多平台!
fontdir的简介下面是截取qtcore中默认的fontdir文件中的中文字库部分#Chinese character font from /enwenquanyi wenquanyi_12pt.bdf BDF n 50 120 uwenquanyi wenquanyi_13pt.bdf BDF n 50 130 uwenquanyi wenquanyi_15pt.bdf BDF n 50 150 uwenquanyi wenquanyi_16pt.bdf BDF n 50 160 uwenquanyi wenquanyi_12ptb.bdf BDF n 75 120 uwenquanyi wenquanyi_13ptb.bdf BDF n 75 130 uwenquanyi wenquanyi_15ptb.bdf BDF n 75 150 uwenquanyi wenquanyi_16ptb.bdf BDF n 75 160 u可以看到共有七列
将坐标原点放在左下角,或中下。
通常,在实际打印过程中,TTF字体是用像素来度量的,如何将矩形框中的字体转成像素呢?有一个计算公式,实例如下:如果18个点的72点每英寸屏下有一
个550的长度,矩形框内有2048个单位。那其像素为550*18*72/72/2048=4.83像素。显然,每英寸里的点取的越多,字就越逼真,同
因为Unicode(UTF16或者UTF8)最适合在任何人之间传递信息,
至于TrueType(不知道是什么东西,先唬着&#61514;)的支援,目前Qte采用的是FreeType2 Livrary来显示字体,可充分享受无段式anti-aliased显示。

过下午的查证:Truetype是由AppleComputer公司和Microsoft公司联合提出的一种新型数学字形描述技术。他用数学函数描述字体
相关文档
最新文档