个人遇到的QT中文编码问题

        最近在用QT完成一个程序时遇到一个困扰了我很久的问题,首先说明一下,在本机上的编译环境为QT Creator+ubuntu。编译完成后copy到其他机器的ubuntu系统中运行(不管装了QT环境没有,现象都一样),结果双击无任何反应,到命令行下运行,提示segmentation default.
        刚开始真是一头雾水,不知道从何处下手去找问题,无奈,只得用qDebug一步一步进行提示,才找到点眉目,发现了一些规律,就是当运行到fromUnicode()或是toUnicode()时就会出现以上提示,例如:
QTextCodec *codec=QTextCodec::codecForName("GBK"); codec->toUnicode(strText);
        由于在程序中没有对codec的值就以判断,codec的值为0时当然就出错了。(刚开始还不知道这个问题,也是找了一些相关的资料才发现的。)出错原因也略知一二了,那就是ubuntu中默认没有提供对中文编码(包括GBK,GB18030,GB2312都试过了)的支持,即使QT中有中文编码的头文件,程序也不会主动去找,当然在本机中编译运行的时候可能就找到了中文编码的头文件或库(这是我的猜想,具体我也还没弄明白,疑惑中~).

        原因找到了,但仍然不知道怎么去解决,知道在网上找到这样一篇文章,受到了很大启发:
http://hi.baidu.com/gpsplus/blog/item/1d5354a7d843029cd1435894.html

我的解决方法如下:
1.在qt安装目录qt/src/plugins/codecs/cn下找到qgb18030codec.h和qgb18030codec.cpp拷贝到程序目录下
2.在程序中加入
#include “qgb18030codec.h” QTextCodec *createForName(const QByteArray &name) { if (name == QGb18030Codec::_name() || QGb18030Codec::_aliases().contains(name)) return new QGb18030Codec; if (name == QGbkCodec::_name() || QGbkCodec::_aliases().contains(name)) return new QGbkCodec; if (name == QGb2312Codec::_name() || QGb2312Codec::_aliases().contains(name)) return new QGb2312Codec; #ifdef Q_WS_X11 if (name == QFontGbkCodec::_name() || QFontGbkCodec::_aliases().contains(name)) return new QFontGbkCodec; if (name == QFontGb2312Codec::_name() || QFontGb2312Codec::_aliases().contains(name)) return new QFontGb2312Codec; #endif return 0; }
以上有错误的两句就变成
QTextCodec *codec=createForName("GBK"); codec->toUnicode(strText);

这样就能找到中文编码了,不会出现以上错误提示了。

你可能感兴趣的:(ubuntu,qt,include,Codec)