QSettings 与中文(反斜杠 转义)

QSettings 与中文

本文介绍的是QSettings的 IniFormat 截止目前(Qt4.7)对中文的支持情况,如果你想实现自己定义格式(比如"[中文] 中文=中文"这样),可参看 QSettings 自定义格式Qt4.4(包含)之前

先看个例子:

#include <QtCore/QCoreApplication>
#include <QtCore/QSettings>

int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QString value = QString::fromLocal8Bit("我是汉字");
QSettings settings("config.ini", QSettings::IniFormat);
settings.setValue("setcion/key", value);

return 0;
}

结果如下:

[setcion]
key=\x6211\x662f\x6c49\x5b57

这儿Value部分显示的是上面4个汉字的UCS2(即UTF-16)编码。如果你喜欢,你可以叫它“乱码”。

为什么四个汉字变成这个样子了呢?

因为4个汉字的Unicode编码超出了ASCII码的范围,而将其序列化的话,有很多种不同的方案,而这些不同的方案中,对特定的人来说,只有一种方案是最合适的,其他的可能都被这特定的人称作乱码。

众口难调啊?怎么办,那就不调了呗。直接给出UTF-16编码,这样一来,尽管每个人都不太喜欢,但总比让多数人都扫兴要好得多。

Qt4.5的转变

从Qt4.5开始,QSettings提供了一个新的成员函数,setIniCodec。这样一来,各种非ASCII码的用户应该高兴一点了,喜欢什么编码自己来设置,而不用考虑什么国际用户。

对简体中文用户来说,GBK还是UTF-8任意选择一个自己喜欢的就行了:

#include <QtCore/QCoreApplication>
#include <QtCore/QSettings>

int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QString value = QString::fromLocal8Bit("我是汉字");
QSettings settings("config.ini", QSettings::IniFormat);
#ifdef LOVE_GBK
settings.setIniCodec("GB2312");
#else
settings.setIniCodec("UTF8");
#endif
settings.setValue("setcion/key", value);

return 0;
}

结果如下:

[setcion]
key=我是汉字Key中的中文

截止到目前的Qt4.6.3,Key 和Section的中文仍不能使用本地编码,比如:

#include <QtCore/QCoreApplication>
#include <QtCore/QSettings>
#include <QtCore/QStringBuilder>

int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QString section = QString::fromLocal8Bit("节");
QString key = QString::fromLocal8Bit("键");
QString value = QString::fromLocal8Bit("我是汉字");
QSettings settings("config.ini", QSettings::IniFormat);
settings.setIniCodec("UTF-8");
settings.setValue(section%"/"%key, value);

return 0;
}

注意:此处字符串连接用的Qt4.6引入的%,如果是之前的版本,换成+并删除相应头文件即可。

结果如下:

[%U8282]
%U952E=我是汉字

同一开始的Value一样,Key和Section中非ASCII字符的仍会进行转义,此处我们看到的就是%U后跟UTF-16的数值。该部分不受 setIniCodec的影响。

不止中文这样

其实不止中文是这样,Qt对传统的Latin系列编码也没有特殊的照顾

当Section Key Value中出现Latin字符时,同样将进行转义。比如:

#include <QtCore/QCoreApplication>
#include <QtCore/QSettings>
#include <QtCore/QStringBuilder>

int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QString section = QString::fromLocal8Bit("ÀÁ");
QString key = QString::fromLocal8Bit("ÀÁ");
QString value = QString::fromLocal8Bit("ÀÁ");
QSettings settings("config.ini", QSettings::IniFormat);
settings.setValue(section%"/"%key, value);

return 0;
}

结果:

[%E0%E1]
%E0%E1=\xe0\xe1Settings源码

%QTDIR%\src\corelib\io\qsettings.cpp

QSettings的数据在内存中存放于 QMap<QString, QVariant> 中,读写文件也就是将文件读入该Map和从该Map写入文件的过程。

ini文件的写入

bool QConfFileSettingsPrivate::writeIniFile(QIODevice &device, const ParsedSettingsMap &map
)

Key的写入相对比较简单,因为本身就是字符串,只需序列化即可(对'0'-'9', 'a'-'z', 'A'-'Z', '_', '-', '.'之外的字符进行转义处理)。

void QSettingsPrivate::iniEscapedKey(const QString &key, QByteArray &result)

Value的写入就很复杂了,分两步走:

  • 将 QVariant 变成 QString 或 QStringList
    • StringList 和 List 型 ==> QStringList,其他转成QString

    • 直接转成字符串的 String LongLong Int Bool Double ...

    • 包含可读信息但不可直接转的 Rect Size Point ...
    • 包含非可读信息的 ByteArray

    • Invalid 型的 QVariant
    • 其他 QVariant
  • 将字符串序列化
    • 主要是对字符的Escape,比如'\0','\a'等控制字符,变成"\\0", "\\a"等
    • 其他控制字符,"\\x.."
    • 大于 7F 的字符,如有codec,则使用codec,如无,则用"\\x...."
    • 字符串内包含';', ',', '='时,字符串两段加引号
    • 字符'\0', "\x.."之后如果是数字(0-9a-fA-F),要继续如此处理

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QSettings节点是Qt框架中用于管理应用程序设置的类。它可以用来读取和写入各种键值对(Key-Value pairs),以实现用户首选项、配置选项以及应用程序状态数据的管理。 在QSettings节点中的一个关键问题是中文支持。QSettings可以很好地处理中文字符,不需要特殊的配置或设置。在读取和写入设置时,QSettings节点会自动处理中文字符的编码和解码,确保数据的正确性。 使用QSettings节点进行中文字符的读取和写入非常简单。读取设置键值对时,可以直接使用中文字符作为键名,并通过QSettings的value()函数获取对应的值。同样地,写入设置键值对时,也可以使用中文字符作为键名,并通过QSettings的setValue()函数将值写入到对应的键名下。 QSettings节点还提供了一些方法来处理中文字符串的保存和加载。例如,可以使用setIniCodec()函数设置保存文件的编码方式,确保中文字符在保存时的正确性。还可以使用sync()函数来手动保存设置,确保修改的设置生效。 总之,QSettings节点是一个方便易用的类,可以很好地处理中文字符的读取和写入。无需额外的设置,通过简单的接口调用就可以实现应用程序设置的管理。无论是用于用户首选项、配置选项还是应用程序状态数据,都可以轻松地使用QSettings节点来管理中文字符的设置。 ### 回答2: QSettings 是 Qt 框架提供的一个用于处理应用程序设置的类。它允许开发人员在应用程序中存储和读取用户偏好设置,并且可以在不同平台上保持跨平台兼容性。 QSettings 使用了一个节点树的概念来组织设置。每个节点都可以有一个唯一的键名称,并且可以有一个或多个子节点。 节点可以使用 setValue() 方法来设置值,也可以使用 value() 方法来获取值。值可以是基本数据类型,如整数、浮点数、字符串,或者是 Qt 的其他数据类型,如 QStringList 和 QVariant。 为了使应用程序设置能够跨平台使用,QSettings 提供了两种存储设置的方式:注册表存储和INI文件存储。在 Windows 平台上,QSettings 默认使用注册表存储设置;在其他平台上,默认使用INI文件存储。但是,开发人员可以通过指定一个不同的文件路径或注册表路径来改变存储方式。 使用 QSettings 的好处之一是它提供了一种方便的方式来保存和加载用户设置,而无需编写复杂的代码。另外,QSettings 还提供了一些方便的方法来处理默认设置、验证输入值、设置应用程序范围的设置等。 总之,QSettings 是一个非常实用的类,可以帮助开发人员轻松管理应用程序的设置,并且可以与不同平台兼容。无论是在存储设置还是读取设置方面,QSettings 都提供了简单、方便的接口,减少了开发人员的工作量。 ### 回答3: QSettings是Qt中用于访问和管理应用程序设置的类。它提供了一种简单方便的方法来存储和读取应用程序的配置信息。 QSettings基于键值对的形式来存储和检索设置数据,并且它支持多种存储格式,包括INI文件格式和注册表格式。 QSettings允许我们使用节点来组织和管理设置数据。节点是一个层次结构,类似于文件系统的目录结构。节点提供了一种有组织的方式来管理不同类别的设置数据。我们可以创建节点,并在其中存储相关的设置数据。 为了使用节点,我们首先需要创建一个QSettings对象。我们可以指定节点的名称作为构造函数的参数。例如,我们可以使用以下代码创建一个名为"settings"的节点: QSettings settings("MyApp", "Settings") 在此示例中,"MyApp"是应用程序的组织名称,而"Settings"是节点名称。通过这种方式,我们可以将应用程序的设置数据存储在名为"MyApp"的节点中。 一旦我们创建了QSettings对象,就可以使用它来读取和写入设置数据。我们可以使用setValue()方法将键值对存储在节点中,并使用value()方法检索相应的值。 例如,我们可以使用以下代码将一个键值对存储在之前创建的"settings"节点中: settings.setValue("key", "value") 然后,我们可以使用以下代码检索该键的值: QString value = settings.value("key").toString() 通过使用节点,我们可以将不同类型的设置数据组织在一起,使其更易于维护和使用。此外,节点还可以帮助我们避免键名冲突,并提供了一种有组织的方式来管理设置数据。 总之,QSettings节点提供了一种组织和管理应用程序设置数据的方式。通过创建节点,我们可以将相关的设置数据组织在一起,并且可以使用节点名称来访问和操作这些数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值