QT中文显示问题

2023-11-18

问题: http://topic.csdn.net/u/20090320/10/287c7dba-29c0-4d76-af75-4d19104f544e.html

C/C++ code

    QTextCodec *text =QTextCodec::codecForName("GB2312"); char *strText = "中文显示"; QString str = text->toUnicode(strText );


好啊 ,我的代码也是用上面方式实现显示中文的,在windows上debug和release版本都没有问题,在linux(我的开发的机器)下也没有问题,但是打包后,在别的linux机器上,出现段错误。 QT 版本:QT-4.4.3 , linux系统: FC 8, 内核: 2.6.23.1-42, 两台linux系统是一样的。

请问我的怎么会出现段错误了?

答案:

问题原因摘要:

Qt中的字体编码分为内置编码以及plugin编码,内置的编码类型可以通过运行%QTDIR%/examples/tools/codecs查看。
可以codecs中看到,默认的文字编码类型不包含GBK、GB18030、GB2312。
通过查阅%QTDIR%/src/plugins文件夹可以发现,其下存在一个名为codecs的文件夹,而其中正包含了cn、jp、kr、tw四类编码格式并且在%QTDIR%/plugins/codecs下也找到了对应的lib以及dll(区分链接方式)。

http://wybolf.spaces.live.com/blog/cns!DBB6BCADEEB5AE52!231.entry
QTextCodec::codecForName

Qt 中 QTextCodec::codecForName("GB18030") 返回为 NULL 的解决

现象:

类似一下代码

QTextCodec* localCode = QTextCodec::codecForName("GB18030");
QTextCodec::setCodecForCStrings(localCode);

此处,localCode返回的为Null

原因:

Qt中的字体编码分为内置编码以及plugin编码,内置的编码类型可以通过运行%QTDIR%/examples/tools/codecs查看。

可以codecs中看到,默认的文字编码类型不包含GBK、GB18030、GB2312。

通过查阅%QTDIR%/src/plugins文件夹可以发现,其下存在一个名为codecs的文件夹,而其中正包含了cn、jp、kr、tw四类编码格式并且在%QTDIR%/plugins/codecs下也找到了对应的lib以及dll(区分链接方式)。

解决方案:

手动加入对codecsplugins的支持。

实现步骤:

1,拷贝对应lib以及dll到qt的bin以及lib中(区分qt链接的方式);

2,在include中新建plugins目录,里面新建一文件Textcodec有如下行:

#include "../../../src/plugins/codecs/cn/qgb18030codec.h"

3,从QTextCodecPlugins继承一个类,内容如下

.h:

   1:  #ifndef __WEX_TEXTCODECPLUGIN_H_INCLUDED

   2:  #define __WEX_TEXTCODECPLUGIN_H_INCLUDED

   3:  

   4:  #include <QtCore/QTextCodecPlugin>

   5:  #include <QtCore/QList>

   6:  

   7:  class WTextCodecPlugin : public QTextCodecPlugin

   8:  {

   9:      Q_OBJECT

  10:  

  11:  public:

  12:      WTextCodecPlugin(QObject* parent = 0);

  13:      virtual ~WTextCodecPlugin();

  14:  

  15:  public:

  16:  

  17:      virtual QList<QByteArray> names () const;

  18:  

  19:      virtual QTextCodec * createForName ( const QByteArray & name );

  20:  

  21:      virtual QList<int> mibEnums () const;

  22:  

  23:      virtual QTextCodec * createForMib ( int mib );

  24:  

  25:      virtual QList<QByteArray> aliases () const;

  26:  };

  27:  

  28:  static WTextCodecPlugin __g_w_textcodeplugin;

  29:  

  30:  static QTextCodec* WGetTextCodeForName(const QByteArray & name)

  31:  {

  32:      return __g_w_textcodeplugin.createForName(name);

  33:  }

  34:  

  35:  typedef WTextCodecPlugin WexTextCodecPlugin;

  36:  

  37:  #endif

 

.cpp:

   1:  #include "WexTextCodecPlugin.h"

   2:  #include <QtCore/QtPlugin>

   3:  #include <WPlugins/Textcodec>

   4:  

   5:  WTextCodecPlugin::WTextCodecPlugin(QObject* parent)

   6:  : QTextCodecPlugin(parent)

   7:  {

   8:  

   9:  }

  10:  

  11:  WTextCodecPlugin::~WTextCodecPlugin()

  12:  {

  13:  

  14:  }

  15:  

  16:  QList<QByteArray> WTextCodecPlugin::names() const

  17:  {

  18:      return QList<QByteArray>() << QGbkCodec::_name() << QGb18030Codec::_name() << QGb2312Codec::_name();

  19:  }

  20:  

  21:  QTextCodec* WTextCodecPlugin::createForName( const QByteArray & name )

  22:  {

  23:      if (name == QGbkCodec::_name())

  24:          return new QGbkCodec();

  25:      else if (name == QGb18030Codec::_name())

  26:          return new QGb18030Codec();

  27:      else if (name == QGb2312Codec::_name())

  28:          return new QGb2312Codec();

  29: 

  30:      return 0;

  31:  }

  32:  

  33:  QList<QByteArray> WTextCodecPlugin::aliases() const

  34:  {

  35:      return QList<QByteArray>() << QGbkCodec::_aliases() << QGb18030Codec::_aliases() << QGb2312Codec::_aliases();

  36:  }

  37:  

  38:  QList<int> WTextCodecPlugin::mibEnums() const

  39:  {

  40:      return QList<int>() << QGbkCodec::_mibEnum() << QGb18030Codec::_mibEnum() << QGb2312Codec::_mibEnum();

  41:  }

  42:  

  43:  QTextCodec* WTextCodecPlugin::createForMib( int mib )

  44:  {

  45:      if (mib == QGbkCodec::_mibEnum() )

  46:          return new QGbkCodec();

  47:      else if ( mib == QGb18030Codec::_mibEnum() )

  48:          return new QGb18030Codec();

  49:      else if ( mib == QGb2312Codec::_mibEnum() )

  50:          return new QGb2312Codec();

  51:  

  52:      return 0;

  53:  }

4,最后即可在原先的地方如下书写

   1:  #include "WexTextCodecPlugin.h"

   2:  

   3:  QApplication a(argc, argv);

   4:  QTextCodec* localCode = WGetTextCodeForName("GB18030");

   5:  QTextCodec::setCodecForCStrings(localCode);

5,项目中附加的lib库中添加

    qcncodecsd.lib 或者 qcncodecs.lib (debug、release)

跟踪可以看出loaclCode已经!=0

运行,乱码问题消失

 

注:

经测试,如果项目中有用到QtXml库,并且XML文件中定义的编码不是UTF-8等内置格式,如GBK。

那么,有可能出现如下症状,

    编译好的程序,debug和release均可在本机运行,然而换一台机器,则发现xml不能正确处理

跟踪QXmlStreamReader可以发现:xml中的所有项目都读取失败了。

通过本篇的方法,也可以解决该问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT中文显示问题 的相关文章

  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent

    请考虑以下代码 include
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 以编程方式确定是否安装了 COM 库 (.DLL)

    C 中是否有一种编程方式来确定是否已安装特定的 COM DLL 或者这是扫描注册表中的 classId 的问题 我通常所做的 如果我再次需要的话也会这样做 是尝试创建一个您知道位于 COM 库中的类的对象实例 通过 ProgID 或 GUI
  • 使用第三方库记录来自 PHP 应用程序的所有 cURL 请求

    好吧 我的 PHP Yii2 应用程序遇到了困难 我需要记录来自应用程序的每个传入和传出请求 传入的请求可以轻松地记录在 PHP 本身中 在引导阶段添加一些处理程序 这很容易 但真正的问题是我正在使用许多第三方库 即 Amazon MWS
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • 如何从 C 程序中获取 NIC 详细信息?

    我想要获取连接到我的计算机的所有 NIC 的以下详细信息 1 接口名称 例如eth0 2 接口编号 如Windows http answers yahoo com question index qid 20080517041705AAOmJ
  • 在 Ubuntu 中找不到 X11/Xlib.h

    我试图在 Linux 上使用 open gl 编写一个相当简单的程序 但在编译时它说 编译拇指 egl 我对 GL 完全陌生 不知道出了什么问题 快速搜索使用 apt search Xlib h 打开 libx11 dev 包 但纯 Ope
  • QWebSocketServer - 不释放内存

    首先 我在安全 websocket 服务器应用程序上运行 valgrind 并发现了一个问题 在 Qt Memcheck 中我必须检查 外部错误 看到它 一些字节是肯定输了 指着我的main就在我的地方QCoreApplication ex
  • 扩展 TabViewStyle styleData

    我目前正在尝试找到一种更好的方法来执行此操作 将图标添加到选项卡 现在 我正在放弃 styleData title 以包含图标源 但如果能够扩展 styleData 就更好了 这样我就可以包含其他自定义属性 这是我当前的黑客 Tab tit
  • Raspberry 交叉编译 - 执行程序以“分段错误”结束

    我有一个自己编写的程序 我想从我的 x86 机器上为 Raspberry Pi 构建它 我正在使用 eclipse 生成的 makefile 并且无法更改此内容 我已经阅读了 CC for raspi 的教程 Hackaday 链接 htt
  • QWinTaskbarProgress 不会显示

    我使用的是windows7和Qt5 3 0 我在 MainWindow 的构造函数中添加了以下内容 但任务栏上没有显示任何内容 我错过了什么 QWinTaskbarProgress pTaskbarProgress new QWinTask
  • 如何使用ilMerge将dll合并到exe文件中? [复制]

    这个问题在这里已经有答案了 可能的重复 将 dll 与 exe 合并 https stackoverflow com questions 14551311 merging dll with exe 好的 所以 我将 ilmerge 的所有文
  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • QML改变图像颜色

    我搜索了如何对图像进行着色 格式为 svg 或 png 我尝试用一 个填充图像的矩形覆盖我的图像 但由于我的图像不是矩形 它会给整个矩形着色 而不仅仅是图像 可以用qml改变图像颜色吗 或者 是否可以使用 QPixmap 更改 qt 使用
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类

随机推荐

  • Edge浏览器没有让我失望! 今天终于可以在win10中模拟IE内核进行前端测试了!

    前言 ietest现在是不是不好用了 Edge浏览器仿真是不是不见了 如图 如果我们在前端开发javascript遇见一些老旧的语法标准 想要测试一下都难 想想都抓狂 不过不用担心 经过这几天的资料查阅 我还是找到了一个解决办法来模拟旧版I
  • Set集合中的SortedSet接口下的实现类TreeSet

    放入TreeSet集合中的元素必须实现Comparable接口 不然会报错 因为这个集合中的元素会自动按元素的大小顺序排序 所以不是实现比较的接口就会出现ClassCastException 还要注意一点的是Set集合中的元素是不可重读的
  • ctfshow web入门刷题3

    web15 看提示找到邮箱 然后尝试登入后台 url admin 尝试点击忘记密码然后提示输入城市 尝试用qq搜索qq号 发现城市为西安 得到后台密码 登入得到flag WEB16 题目提示php探针 所以url tz php打开探针然后搜
  • 当你穿越到道诡异仙的世界,如何利用密码学知识区分幻想和现实?

    题解 牛群的能量 题目考察的知识点动态规划题目解答方法的文字分析用 f i 代表以第 i个数结尾的 和最大子群能量值之和 设数组的长度为n 则本题的答案时从0到n 1这n个f 题解 牛牛的名字游戏 题目考察的知识点字符串题目解答方法的文字分
  • TensorFlow在MNIST中的应用-循环神经网络RNN

    参考 1 TensorFlow技术解析与实战 2 https www cnblogs com hellcat p 7401706 html 3 http www jianshu com p 3dbeb3ab9aa3 用TensorFlow搭
  • 如何设计一个麻雀般的微型分布式架构?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由mariolu 发表于云 社区专栏 序言 初衷 设计该系统初衷是基于描绘业务 或机器集群 存储模型 分析代理缓存服务器磁盘存储与回源率的关系 系统意义是在腾讯云成本优化过程中
  • 什么是遗传算法?

    00 目录 遗传算法定义 生物学术语 问题导入 大体实现 具体细节 问题汇总 01 什么是遗传算法 1 1 遗传算法的科学定义 遗传算法 Genetic Algorithm GA 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的
  • 1186: 零起点学算法93——改革春风吹满地

    Description 改革春风吹满地 不会AC没关系 实在不行回老家 还有一亩三分地 谢谢 乐队奏乐 话说部分学生心态极好 每天就知道游戏 这次考试如此简单的题目 也是云里雾里 而且 还竟然来这么几句打油诗 好呀 老师的责任就是帮你解决问
  • Python进行模糊匹配

    Mr Chen昨天提出了一个问题一起探讨 问题如下 Python库里有fuzzywuzzy和difflib 两个库均可实现词粒度的模糊匹配 同时可设定模糊阈值 实现关键词的提取 地址匹配 语法检查等 针对fuzzywuzzy的process
  • Flink学习27:驱逐器

    import org apache flink api common eventtime SerializableTimestampAssigner WatermarkStrategy import org apache flink api
  • API接口的设计思路

    API接口设计是软件开发中非常重要的一环 良好的设计规范能够提高开发效率 减少问题和错误 并增强系统的可维护性和可扩展性 本文从程序员的视角 讨论一些常见的API接口设计规范 一 遵循RESTful原则 REST Representatio
  • Notepad++作死,国产文本编辑器Notepad--发布

    作死的Notepad Notepad 和 Notepad 都是基于 Windows 的文本编辑器 通常用于编写和编辑纯文本文件 这两个应用程序都是简单的轻量级程序 提供基本的文本编辑功能 Notepad 是一口君经常使用的一款文本编辑软件
  • 最佳实践:基于vite3的monorepo前端工程搭建

    一 技术栈选择 1 代码库管理方式 Monorepo 将多个项目存放在同一个代码库中 选择理由1 多个应用 可以按业务线产品粒度划分 在同一个repo管理 便于统一管理代码规范 共享工作流 选择理由2 解决跨项目 应用之间物理层面的代码复用
  • openstack Storage 组件 Swift 和 Cinder

    Storage 组件 Swift 和 Cinder 本文将介绍 OpenStack Block Swift 和 Object Glance 存储 解释它如何融入到整体架构中 并展示它的操作方式 本文还将在介绍这些工具的过程中了解了如何安装
  • CMake GUI工具使用 MinGW 64构建工程

    系列文章目录 文章目录 系列文章目录 前言 一 open Project是灰色 前言 CMake GUI 打开 CMake GUI 在 Where is the source code 字段中 选择 Krita 源代码目录 E krita
  • 学习笔记-汉诺塔 分治算法

    用分治算法解决汉诺塔 分治法是一种很重要的算法 字面上的解释是 分而治之 就是把一个复杂的问题分成两个或更多的相同或相似的子问题 再把子问题分成更小的子问题 直到最后子问题可以简单的直接求解 原问题的解即子问题的解的合并 这个技巧是很多高效
  • vue(十二)——vue3新特性之Teleport

    teleport是什么 teleport其实就是vue3新增的一个内置组件 其实就是一个新增标签 teleport的作用 官方解释 将其插槽内容渲染到 DOM 中的另一个位置 简单来说就是将dom节点挂载到你指定的位置 遮挡层案例举例 遮挡
  • Linux 设置文件夹可读可写

    在 Linux 系统中 可以使用 chmod 命令来更改文件夹的读写权限 设置文件夹可读可写 可以使用如下命令 chmod R777 path to folder 其中 chmod 是更改文件权限的命令 R 是递归更改权限 包括子文件夹和文
  • AD中拖动器件,无法移动在一起如何解决

    1 AD PCB拖动器件 无法移动在一起时如何解决 在PCB 界面 按下快捷键O P进入 preference对话框 找到PCB Edit gt Interactive Routing gt Dragging gt Component Pu
  • QT中文显示问题

    问题 http topic csdn net u 20090320 10 287c7dba 29c0 4d76 af75 4d19104f544e html C C code QTextCodec text QTextCodec codec