×
Namespaces

Variants
Actions

说说Qt中中文字符的编解码那些事

From Nokia Developer Wiki
Jump to: navigation, search

Delete instructional text in italic

This article explains how to ... Replace the abstract text with a short paragraph (or sentence) describing what the topic covers.

Enter article metadata as described below. Note that this template can be placed anywhere in the article. Do not remove parameters that you do not use

Article Metadata
Compatibility
Platform(s):
Symbian
Article
Created: ()
Last edited: hamishwillee (13 Jun 2012)

Contents

Introduction

在开发中文应用中,我们总免不了和中文字符打交道,常常中文字符的编解码问题会困扰我们很久,本文即将开发中遇到的一些常见问题做个小结。

中文字符初始化QString

我们可能习惯在代码中这样写:

{
QString str = "你好";
label->setText(str);
}

可是运行出来后,标签上并没有见到让人亲切的“你好”,而是一串“ÄãºÃ”,亦或“����”,这就是字符的编码问题,要解决这个问题就要找到字符的编码方式,再设置同样的解码方式即可。 用NotePad++打开源码文件,通过“格式”菜单可以查看到编码方式,对于中文字符,我们一般将其设置为GBK或UTF,保存后,用Qt Creator打开源码,在代码中添加代码设置应用的默认编码方式和刚才设置的匹配:

{
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
QString str = "你好";
label->setText(str);
}

实际上Qt提供了语言本地化和国际化的工具Qt Linguist,我们可以通过这个工具设置任意我们需要的语言,也就是说像上述代码这种显示中文字符的方法我们并不推荐,推荐使用Qt Linguist工具来实现翻译,在代码中尽量使用英文字符。关于Qt Linguist的使用方法可以参考文章Qt的国际化和本地化.

传递中文路径到QUrl

还有一种情况就是我们通过获取的文件路径名包含中文字符,将这个路径名传递给QUrl后,QUrl会进行一个%的编码,比如C:\Users\Public\Pictures\Sample Pictures\测试.jpg 传递给QUrl后,可能变成:C:\Users\Public\Pictures\Sample Pictures\%E5%A4%A9%E7%9C%9F.jpg,但是用这样的url会到文件操作出错,解决办法就是用QUrl的静态方法fromPercentEncoding()来解码,例如:

{
QByteArray str;
str.append( itemUrl(index).toString()); //itemUrl 为获取的文件路径,已经经过了%编码
return QUrl::fromPercentEncoding(str);//返回正确的文件路径
}

QUrl这种自以为是的%编码还会体现在一串含有中文字符的网络地址中,例如:地址"qt.nokia.com/List of holidays.xml"会被编码成:"qt.nokia.com/List%20of%20holidays.xml",解决办法是用fromEncoded()来解码

{
QUrl orig("http://qt.nokia.com/List%20of%20holidays.xml");
QByteArray data;
data.append(orig.toString());
QUrl url = QUrl::fromEncoded(data);
qDebug()<<url; //打印结果:http://qt.nokia.com/List of holidays.xml
}

Summary

如果在开发中遇到中文字符编码的问题,找到原因即可输出正确结果。

相关链接

Add categories below. Remove Category:Draft when the page is complete or near complete

This page was last modified on 13 June 2012, at 13:59.
111 page views in the last 30 days.
×