织梦CMS - 轻松建站从此开始!

罗索

QT文本编码转换方法

jackyhwei 发布于 2010-06-04 13:30 点击:次 
QT 中的 QString 内容使用 Unicode 作为文本编码。但是实际系统中通常采用的是其他编码,例如 GBK , utf8 等。
TAG:

QT中的QString内容使用Unicode作为文本编码。但是实际系统中通常采用的是其他编码,例如GBK,utf8等。为了便于兼容这些格式,QT中还设置了两个字符串类型:

QCString类: C类型字符串,必须以0结尾,也就是中间不能含有0. 例如GBK编码的字符串

QByteArray类: 中间可以含有0.例如utf8编码的字符串

为了便于编码转换,QT还提供了一套具备扩展性的编码转换器:

QTextCodec

这个类定义了编码转换器的接口,可以以插件方式继承这个类,实现各种编码转换器。

当然,QT也内置了多种编码转换器(不包括GBK)。

在使用编码转换器时,有以下几种方式:

1. 在程序开始位置设置QObject的成员函数tr()的编码器,后面程序中都可以用tr()直接转换字符串;

QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //或者codecForName("GBK")

… ….

QString str(tr(“本地文本”));

2. QTextCodectoUnicode方法来显示中文

QTextCodec *codec = QTextCodec::codecForLocale();

QString a = codec->toUnicode("本地文本");

3. 使用QStringfromLocal8Bit()函数族;

QString str = str.fromLocal8Bit("哈哈哈");

通过比较,方法1对于界面文本处理是比较好的,可以一次设置,全局使用。而且tr函数可以用于国际化,在把软件转换为其他语言版本或者多语言版本时,只需通过qm文件就可以,非常方便。

方法2使用非常灵活,适合于程序中处理特定编码字符串的时候使用. 例如读取文件内容。

方法3只是为了方便QString类使用,而对QTextCodec类的toUnicode()函数进行的一些封装。效率上肯定要差一些。例如:fromLocal8Bit()就是利用了codeForLocale()解码器。

可能遇到的问题:

调用QTextCodec::codecForLocale();没有问题。

而调用plugins中的codecs,例如GBK. QTextCodec:: codecForName("GBK")就找不到相应的解码器,得到空指针。

这种情况通常是你的QT编译时是作为静态链接库形式编译的。而plugins需要是动态链接库。要先检查你用到的plugins是否已经编译了,插件都放在qtXXX/plugins/文件夹下了。例如GBK,GB18030,GB2312的解码器的调试版本就是qtXXX/plugins/codecs/qcncodecsd4.dll。

//app.addLibraryPath(QObject::tr("C:\\qt-win-opensource-src-4.4.3\\plugins")); //这段代码不用加入也可以正常执行,如果加入的话,路径中最好不要有中文

  1. QTextCodec *codec = QTextCodec::codecForName("GBK"); 
  2. QString teststr = codec->toUnicode("GB编码"); 
  3. std::string stdstring("中文"); 
  4. QString strchinese = codec->toUnicode(stdstring.c_str()); 

此外,为了对某些分块的字符串(例如从网络中获得的字符串片段)进行编码转换,QT还提供了一个QTextDecoder的辅助类,可以帮助对这类字符串进行解码。

 

  1. QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); 
  2. QTextDecoder *decoder = codec->makeDecoder(); 
  3. QString string; 
  4. while (new_data_available()) { 
  5.      QByteArray chunk = get_new_data(); 
  6.      string += decoder->toUnicode(chunk); 

中文字符转换为 std::string

  1. QTextCodec *codec = QTextCodec::codecForName("GBK"); 
  2. if (codec) 
  3.   QString strChinese("中国"); 
  4.   QByteArray gbkString = codec->fromUnicode(strChinese); 
  5.   std::string strstd = gbkString.data(); 

osg显示中文字符

  1. osgText::Text* pText; 
  2. QString strUnicodeText("中国"); 
  3. QByteArray utf8Bytearray = strUnicodeText.toUtf8(); 
  4. pText->setText(utf8Bytearray.data(),osgText::String::ENCODING_UTF8); 

原文:http://hi.baidu.com/wenjiejia/blog/item/cf7fd2b44194237b8bd4b2e3.html

(wenjiejia)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201006/9578.html]
本文出处:hi.baidu.com 作者:wenjiejia
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容