Qt之QUrl

来源:互联网 发布:如何培养英语兴趣 知乎 编辑:程序博客网 时间:2024/05/16 07:07

简述

QUrl 类提供了一个方便的接口使用 URLs。

它可以解析和构造编码和未编码形式的 URLs。QUrl 也支持国际化域名(IDNs)。

  • 简述
  • 详细描述
  • 错误检查
  • 字符转换
  • URL格式
    • scheme
    • Authority
    • user info
    • path
    • query
    • fragment
  • 深入使用
    • 相对路径
    • 用户输入
    • 文件名
    • 主机端口
    • 本地文件
    • 百分比编码
    • 有效性

详细描述

最常见的使用QUrl 的方式是通过构造函数来初始化,传递一个 QString 参数。

QUrl url("https://github.com/");

然而,也可以使用 setUrl()。

QUrl url;url.setUrl("https://github.com/");

也可以逐渐地构造 URL,通过调用 setScheme()、setUserName()、setPassword()、setHost()、setPort()、setPath()、setQuery() 和 setFragment()。一些方便的函数也可供使用:setAuthority() 设置用户名、密码、主机和端口。setUserInfo() 设置用户名和密码。

URLs 可以用两种形式表示:编码或未编码。未编码形式适用于显示给用户,编码形式通常会发送到一个 Web 服务器。例如,未编码的URL "http://bühler.example.com/List of applicants.xml" 将被发送到服务器为 "http://xn--bhler-kva.example.com/List%20of%20applicants.xml"

可以使用 toString() 来获取 URL 人类可读的表示。这种表示方法适合以未编码形式将 URL 显示给用户。然而,编码的形式由 toEncoded() 返回,仅供内部使用,传递给 Web 服务器、邮件客户等。两种形式在技术上正确、明确地表示相同的 URL - 事实上,传递任何一种形式给 QUrl 的构造函数或使用 setUrl() 都将产生相同的 QUrl 对象。

QUrl 符合 RFC 3986 (统一资源标识符:通用的语法)中的 URL 规范,包括 RFC 1738 (统一资源定位器)中方案的扩展。如果 QUrl 中的折叠规则符合 RFC 3491 ,它还兼容 file URI specification 来自 freedesktop.org,提供使用 UTF-8(IDN 要求) 本地编码编码的文件名。

RFC 3491 是“Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN)”,描述了如何准备一个国际化域名,包括对一个域名字段进行映射、正规化以及禁止性过滤等等操作。

错误检查

在 URL 解析或使用单独的 setter 函数(例如:setScheme()、setHost() 或 setPath())设置 URL 的组成部分时,QUrl 能够检测许多错误。如果解析或 setter 函数成功,任何先前记录的错误条件将被丢弃。

默认情况下, QUrl 的 setter 函数操作在 QUrl::TolerantMode 解析模式下,这意味着他们接受一些常见错误和不实数据。解析的另一种方式是 QUrl::StrictMode,这适用于进一步检查。详见 QUrl::ParsingMode 描述不同的解析模式。

QUrl 只检查符合规范的 URL。它并不试图验证被处理程序预期的高层协议的 URLs 格式。例如,下面的 URIs 都被 QUrl 认为是有效,即使在使用时他们不合理:

  • "http:/filename.html"
  • "mailto://example.com"

当解析器遇到错误时,它通过信号事件 isValid() 返回 false,并且 toString() / toEncoded() 返回一个空字符串。如果需要将 URL 未能解析的原因显示给用户,可以通过调用 QUrl 的 errorString() 来获得错误条件。注意:这个信息是高度技术性的,可能对于用户没有意义。

QUrl 仅能够记录一个错误条件。如果找到一个以上错误,没有定义报告哪个错误。

字符转换

遵循这些原则,以避免在处理 URL 和字符串时,出现错误的字符转换:

  • 当从一个 QByteArray 或一个char * 创建包含 URL 的 QString 时,记得要用 QString::fromUtf8()。

URL格式

scheme

scheme 指定使用的传输协议,它由 URL 起始部分的一个或多个 ASCII 字符表示。scheme 只能包含 ASCII 字符,对输入不做转换或解码,必须以 ASCII 字母开始。

scheme 严格兼容 RFC 3986:scheme = ALPHA *( ALPHA / DIGIT / “+” / “-” / “.” )

协议 描述 file 资源是本地计算机上的文件。格式:file:///,注意后边应是三个斜杠。 ftp 通过 FTP 访问资源。格式:FTP:// gopher 通过 Gopher 协议访问该资源。 http 通过 HTTP 访问该资源。格式:HTTP:// https 通过安全的 HTTPS 访问该资源。格式:HTTPS:// mailto 资源为电子邮件地址,通过 SMTP 访问。格式:mailto: MMS 通过支持MMS(流媒体)协议的播放该资源(代表软件:Windows Media Player)。格式:MMS:// ed2k 通过 支持ed2k(专用下载链接)协议的P2P软件访问该资源(代表软件:电驴)。格式:ed2k:// Flashget 通过 支持Flashget:(专用下载链接)协议的P2P软件访问该资源(代表软件:快车)。格式: Flashget:// thunder 通过 支持thunder(专用下载链接)协议的 P2P 软件访问该资源(代表软件:迅雷)。格式: thunder:// news 通过 NNTP 访问该资源。


下图显示了一个 URL,其 scheme 是 ftp

这里写图片描述

要设置 scheme,使用以下方式:

QUrl url;url.setScheme("ftp");

Authority

URL 的 authority 由用户信息、主机名和端口组成。所有这些元素都是可选的,即使 authority 为空,也是有效的。

格式:username:password@hostname:port

用户信息和主机由'@' 分割,主机和端口由 ':'分割 。如果用户信息为空,'@' 必须被省略。尽管端口为空时,允许使用 ':'

这里写图片描述

host:指存放资源的服务器的域名系统(DNS)主机名或 IP 地址。

port:整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如 HTTP 的默认端口为80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL 中就不能省略端口号这一项。

user info

user info 指用户信息,是 URL 中 authority 可选的一部分。

用户信息包括:用户名和一个可选的密码,由 ':' 分割。 如果密码为空,':'必须被省略。

这里写图片描述

path

由零或多个 / 隔开的字符串,一般用来表示主机上的一个目录或文件地址。在 authority 之后,query 之前。

这里写图片描述

对于没有层级的 schemes,路径将是 scheme 后的所有部分,像下面这样:

这里写图片描述

query

query 指查询字符串,可选,用于给动态网页(例如:使用 CGI、ISAPI、PHP/JSP/ASP/ASP、.NET 等技术制作的网页)传递参数,可有多个参数,用 & 隔开,每个参数的名和值用 = 隔开。

这里写图片描述

构建一个查询尤其方便,请参考:Qt之QUrlQuery

fragment

fragment 指定网络资源中的片断。是 URL 的最后一部分,由'#' 后面跟的字符串表示。通常指的是用于 HTTP 页面上的某个链接或点。

例如:一个网页中有多个名词解释,可使用 fragment 直接定位到某一名词解释。

这里写图片描述

fragment 有时也被称为 URL“引用”。

传递一个 QString()(null 字符串)将取消 fragment 的设置。传递一个参数 QString(“”)(空而非 null 字符串)将 fragment 设置为一个空字符串(和原始 URL 一样,只有一个 "#")。

深入使用

相对路径

调用 isRelative() 可以判断 URL 是否是相对的。一个相对的 URL 可以被转变通过将它作为参数传递给 resolved(),会返回一个绝对 URL。isParentOf() 用来确定一个 URL 是否是另一个的 parent。

QUrl resolved(const QUrl &relative) const

如果 relative 不是一个相对 URL,该函数会直接返回 relative。否则,这两个 URL 的路径会进行合并,返回的新 URL 会有 base URL 的 scheme 和 authority。

合并后的路径,就像下面这样:

QUrl baseUrl("http://qt.digia.com/Support/");QUrl relativeUrl("../Product/Library/");qDebug(baseUrl.resolved(relativeUrl).toString());// 打印 "http://qt.digia.com/Product/Library/"

调用 resolved() 使用 "..",返回原始目录的上级目录。同样,使用 "../.." 将返回上上一层目录。如果 relative 是 "/",路径会变成 "/"

用户输入

[static] QUrl fromUserInput(const QString &userInput)

可以被扣除,返回一个 userInput 指定的有效 URL;如果不能,则会返回一个空 QURL。

大多数应用程序,可以浏览网页,允许用户输入一个 URL 形式的简单字符串。此字符串可以手动输入到地址栏,从剪贴板中获得,或者通过命令行参数传递。

当没有一个有效的 URL 字符串时,执行最好的猜测,使各种web相关的假设。

当字符串对应系统上的一个有效文件路径时,会构造一个 file:// URL,使用 QUrl::fromLocalFile()。

如果不是这种情况,试图把字符串变成一个 http://ftp:// URL。这时,后者字符串从以 'ftp' 开始。结果然后通过 QUrl 的 tolerant 解析器传递,如果成功,则会返回一个有效的 QUrl;否则,返回 QUrl()。

例如:

  • qt-project.org -> http://qt-project.org
  • ftp.qt-project.org -> ftp://ftp.qt-project.org
  • hostname -> http://hostname
  • /home/user/test.html -> file:///home/user/test.html

文件名

QString fileName(ComponentFormattingOptions options = FullyDecoded) const

返回文件的名称,包括目录路径。

注意:如果这个 QUrl 对象路径以斜杠结束,文件的名称是空的。

如果路径不包含任何斜线,完全返回作为文件名。

示例:

QUrl url("http://qt-project.org/support/file.html");// url.adjusted(RemoveFilename) == "http://qt-project.org/support/"// url.fileName() == "file.html"

参数 options 控制如何格式化文件名称组成。所有值产生一个明确的结果。使用 QUrl::FullyDecoded,所有百分比编码序列被解码;否则,返回值可能包含在QString的编码形式不能表示的一些百分比编码序列。

主机、端口

例如,通过 socket 连接到一个指定 QUrl 包含的主机、端口:

QTcpSocket sock;sock.connectToHost(url.host(), url.port(80));

本地文件

可以使用 fromLocalFile() 构造一个 QUrl,通过传递一个本地文件路径。toLocalFile() 将一个 URL 转换为本地文件路径。

QUrl url = QUrl::fromLocalFile("E:\\Qt.txt");// QUrl("file:///E:/Qt.txt")

百分比编码

为方便生成编码 URL 字符串或查询字符串,有两个静态函数:fromPercentEncoding() 和 toPercentEncoding(),处理编码和解码的百分比 QString 对象。

[static] QByteArray toPercentEncoding(const QString &input, const QByteArray &exclude = QByteArray(), const QByteArray &include = QByteArray())

返回一个编码的输入副本 。输入首先转换为 UTF-8,没有在无限制组中的所有 ASCII 字符是百分比编码的。 为了防止字符变为百分比编码,可以将他们传递给 exclude,为了迫使字符变为百分比编码,将他们传递给 include。

无限制的定义是:ALPHA / DIGIT / “-” / “.” / “_” / “~”

QByteArray ba = QUrl::toPercentEncoding("{a fishy string?}", "{}", "s");qDebug(ba.constData());// 打印 "{a fi%73hy %73tring%3F}"

有效性

构建一个 URL 后,可以在任何时候调用 isValid(),来检查 URL 的有效性。如果返回 false,应该在继续之前 clear() URL,或通过为 setUrl() 传递一个新的 URL 重新开始。

bool isValid() const

URL 运行通过一致性测试。URL 的每一部分都必须符合 URI 标准的标准编码规则,URL 才是有效的。

bool checkUrl(const QUrl &url) {    if (!url.isValid()) {        qDebug(QString("Invalid URL: %1").arg(url.toString()));        return false;    }    return true;}
2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 佛山南海车管所怎么办替人消分流程 福州快处中心几流程要怎么办 被对方追尾了对方只有交强险怎么办 摩托车行驶证年检过期一年半怎么办 户口迁到杭州了身份证掉了怎么办 户口已迁至外面要补办结婚证怎么办 汽车年检时间过了1个月怎么办 户口在老家在北京工作怎么办招工 报考驾照时手机号留错了怎么办 合肥驾照换证体检没过怎么办 驾驶证记分周期到了违章未消怎么办 驾照被扣科目一过期没考怎么办 驾驶证暂扣过了换证日期怎么办? 考驾照科目二身份证丢了怎么办 驾照科目一考试身份证丢了怎么办 换驾驶证名下有车辆脱审怎么办 交警把驾驶证和行车证扣了怎么办 连续两天驾照都是扣12分怎么办? 交警开的电动车罚单丢了怎么办 驾驶证b证体检报告拖期怎么办 在中国把美国护照弄丢了怎么办 拿了驾照两年了不敢上高速怎么办 我要移民过香港大陆的驾驶证怎么办 交警开的扣行驶证的单不见了怎么办 行驶证累计记分满12分后怎么办 行车证丢了被交警查到怎么办 手机摔了一下一半黑屏了怎么办 三星手机的显示屏插头坏了怎么办? 被普通的手机维修店骗了怎么办? 手机外屏裂了内屏进水了怎么办 小米2s手机忘了解锁图案怎么办 红米note5手机屏烂了怎么办 网上买好高铁票身份证没带怎么办 高铁票买好了身份证丢了怎么办 苏州园区社保卡丢了怎么办 大学办的社保卡丢了怎么办 毕业六年了大学社保卡丢了怎么办 医保卡丢了补办后卡里余额怎么办 银行卡丢了记不住卡号怎么办 哈尔滨医保卡挂失后又找到了怎么办 孩子在哈尔滨户口在外地医保怎么办