QString 详细介绍(三)

查询字符串数据

如果你想查看QString是以特定的子字符串开始还是结束,请使用startsWith() 或endsWith()。如果您只想检查 QString 是否包含特定字符或子字符串,请使用 contains() 函数。如果要了解特定字符或子字符串在字符串中出现的次数,请使用 count()。

可以使用重载运算符(如运算符<()、运算符<=()、运算符==()、运算符>=()等来比较 QStrings。请注意,比较完全基于字符的数字 Unicode 值。它非常快,但不是人类所期望的;QString::localeAwareCompare() 函数是排序用户界面字符串的更好选择。

要获取指向实际字符数据的指针,调用 data() 或 constData() 。这些函数返回指向 QChar 数据开头的指针。指针保证保持有效,直到在 QString 上调用非常量函数。

在 8 位字符串和 Unicode 字符串之间进行转换

QString 提供了以下三个函数,这些函数将字符串的 const char * 形式作为 QByteArray:toUtf8()、toLatin1() 和 toLocal8Bit()的返回值。

toLatin1()返回一个拉丁语-1 (ISO 8859-1) 编码的 8 位字符串。

toUtf8() 返回一个 UTF-8 编码的 8 位字符串。UTF-8 是 US-ASCII (ANSI X3.4-1986) 的超集,它通过多字节序列支持整个 Unicode 字符集。

toLocal8Bit() 使用系统的本地编码返回一个 8 位字符串。

要从这些编码之一进行转换,QString 提供了 fromLatin1()、fromUtf8() 和 fromLocal8Bit()。其他编码通过 QTextCodec 类进行支持。

如上所述,QString 提供了许多函数和运算符,使得与 const char * 字符串的互操作变得容易。但此功能是一把双刃剑:如果所有字符串都是 US-ASCII 或 Latin-1,它会使 QString 更方便使用,但始终存在使用错误的 8 位编码完成从 const char * 到const char * 的隐式转换的风险。若要最大程度地降低这些风险,可以通过定义以下两个预处理器符号来关闭这些隐式转换:

QT_NO_CAST_FROM_ASCII 禁用从 C 字符串文本和指针到 Unicode 的自动转换。

QT_RESTRICTED_CAST_FROM_ASCII 允许从 C 字符和字符数组自动转换,但禁用从字符指针到 Unicode 的自动转换。

QT_NO_CAST_TO_ASCII禁用从 QString 到 C 字符串的自动转换。

为应用程序全局定义这些预处理器符号的一种方法是将以下条目添加到 qmake 项目文件中:

DEFINES += QT_NO_CAST_FROM_ASCII \
             QT_NO_CAST_TO_ASCII

然后,您需要显式调用 fromUtf8()、fromLatin1() 或 fromLocal8Bit() 来从 8 位字符串构造 QString,或使用轻量级 QLatin1String 类,例如:

QString url = QLatin1String("http://www.unicode.org/");

同样,您必须显式调用 toLatin1()、toUtf8() 或 toLocal8Bit() 才能将 QString 转换为 8 位字符串。(其他编码通过 QText编解码器类进行支持)

C程序注意事项:

由于C++的类型系统以及 QString 是隐式共享的事实,QStrings 可能被视为整数或其他基本类型。例如:

QString Widget::boolToString(bool b)
{
    QString result;
    if (b)
        result = "True";
    else
        result = "False";
    return result;
}

result变量是在堆栈上分配的普通变量。当调用 return 时,由于我们按值返回,因此将调用复制构造函数并返回字符串的副本。由于隐式共享,不会发生实际复制。

后续公众号会发布系列教程,更多内容请关注公众号:程序猿学习日记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值