`
king_tt
  • 浏览: 2112163 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Qt进行UrlEncode/UrlDecode(URL编码/解码)

 
阅读更多

为了让包含中文的 URL 可以使用,需要进行 UrlEncode 编码。Java 中有现成的类库可以使用,其实我们 Qt 进行网络编程时,框架中也带了 UrlEncode 的功能。

下面是我写的一个小程序,带图形界面的,可以对包含中文的 URL 进行 UrlEncode 。

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLineEdit>
#include <QLabel>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void onConvert();

protected:
    void resizeEvent(QResizeEvent *);
private:
    QLabel *m_labelInputPrompt;
    QLineEdit *m_editInput;
    QLabel *m_labelOutputPrompt;
    QLabel *m_labelOutput;
    QPushButton * m_btnConvert;
};

#endif // WIDGET_H

源文件:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QHBoxLayout * layoutInput = new QHBoxLayout();
    m_labelInputPrompt = new QLabel(QString::fromLocal8Bit("请输入汉字:"));
    m_editInput = new QLineEdit();
    m_btnConvert = new QPushButton(QString::fromLocal8Bit("转换"));
    layoutInput->addWidget(m_labelInputPrompt, 1);
    layoutInput->addWidget(m_editInput, 2);
    layoutInput->addWidget(m_btnConvert);

    QHBoxLayout * layoutOutput = new QHBoxLayout();
    m_labelOutputPrompt = new QLabel(QString::fromLocal8Bit("GB2312 Percent Encode:"));
    m_labelOutput = new QLabel();
    m_labelOutput->setFrameShape(QFrame::Box);
    layoutOutput->addWidget(m_labelOutputPrompt);
    layoutOutput->addWidget(m_labelOutput);

    QVBoxLayout * layout = new QVBoxLayout;
    layout->addLayout(layoutInput);
    layout->addLayout(layoutOutput);

    setLayout(layout);

    connect(m_btnConvert, SIGNAL(clicked()), this, SLOT(onConvert()));
}

Widget::~Widget()
{

}

void Widget::resizeEvent(QResizeEvent *)
{

}

void Widget::onConvert()
{
    QString strInput = m_editInput->text();
    if(strInput.isEmpty())
    {
        return;
    }
    QTextCodec * codecGB2312 = QTextCodec::codecForName("GB2312");
    QByteArray byteArrayGB2312 = codecGB2312->fromUnicode(strInput);
    QByteArray byteArrayPercentEncoded = byteArrayGB2312.toPercentEncoding();
    m_labelOutput->setText(QString(byteArrayPercentEncoded));
}

上面的代码,核心的就是 onConvert() 函数,其它的都是搭建界面需要的。

下面是 main() 函数:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //set codecs to UTF-8
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

    QFont font("Microsoft yahei");
    font.setPixelSize(28);
    a.setFont(font);

    Widget w;
    w.show();

    return a.exec();
}

main() 函数很简单,启动界面而已。

在 onConvert() 函数中,我们从编辑框获取文本,构建一个 GB2312 编码的 TextCodec ,然后使用其 fromUnicode() 方法将得到的文本转化为使用 GB2312 编码过的 QByteArray ,再使用 QByteArray 的 toPercentEncoding() 方法转换成正常的 URL 格式。

对于包含汉字的 URL ,汉字的编码常用的有两种 GB2312 和 UTF-8 ,本文是用采用 GB2312 编码进行转换。

如果是 UTF-8 ,更简单,在上面的程序上稍作修改,不用构造 GB2312 的 TextCodec ,直接使用从编辑框获取的 QString 对象的 toUtf8() 方法得到 QByteArray,然后调用 toPercentEncoding() 方法即可。 onConvert() 代码如下:

    QString strInput = m_editInput->text();
    if(strInput.isEmpty())
    {
        return;
    }

    QByteArray ba = strInput.toUtf8();
    QByteArray byteArrayPercentEncoded = ba.toPercentEncoding();
    m_labelOutput->setText(QString(byteArrayPercentEncoded));


至于 UrlDecode ,和 UrlEncode 过程是相反的,就不再细说了。

一个小插曲,我的小程序原本是用 Qt 4.x 写的,今天发现在 Qt 5.2.0 上,QTextCodec 的一些方法没有了,如 setCodecForTr / setCodecForCStrings 。

分享到:
评论

相关推荐

    c语言开发图书管理系统项目源码+数据+可运行程序

    c语言开发图书管理系统项目源码+数据+可运行程序 主要功能有:1、以管理员或读者不同身份注册账户。2、登录、找回密码、修改密码。3、管理员:图书入库,清除库存,统计书籍数量,统计读者借书情况,在馆书籍排序,读者排序。4、读者:查看个人借阅信息,借书,还书,按书名、作者、出版社检索图书,查询全部在馆图书。

    基于transformer的多模态脑肿瘤分割.zip

    本项目旨在利用Transformer模型实现多模态脑肿瘤分割。多模态脑肿瘤分割对于脑肿瘤的诊断和治疗具有重要意义。 我们采用Transformer模型,通过分析脑部MRI、CT、PET等不同模态的医学影像数据,实现对脑肿瘤区域的自动分割。项目使用的数据集包括公开的脑肿瘤影像数据集,如BRATS、Medical Segmentation Decathlon等,并进行了预处理,包括图像增强、分割和特征提取等。 在运行环境方面,我们使用Python编程语言,基于TensorFlow、PyTorch等深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对多模态脑肿瘤的快速、准确分割,为脑肿瘤的诊断和治疗提供有力支持。同时,项目成果也可应用于其他医学影像分析领域。

    马尔文高浓度池说明书 High Concentration Cell (ZEN1010)

    马尔文高浓度池说明书 High Concentration Cell (ZEN1010)

    如何提高APP商业变现能力.docx

    如何提高APP商业变现能力.docx

    node-v12.20.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    R语言绘制SCI科研生存ROC曲线源代码.zip

    把input里面的数据替换成自己的数据,打开R,点Run,可以直接出图!文件适合有R语言基础的同学。

    高电压技术(第三版)课后习题答案

    高电压技术(第三版)课后习题答案

    Linux线程同步:深入理解与实践.pdf

    linux之线程同步一。 本文深入探讨了Linux线程同步的几种常见机制,并提供了代码示例。希望这些信息能够帮助你更好地理解和应用线程同步技术。在编写多线程程序时,请务必谨慎,确保线程安全。

    1999-2022年企业持续绿色创新水平数据.dta

    1999-2022年企业持续绿色创新水平数据.dta

    数据结构实验代码三个方法求最大公约数.rar

    数据结构实验代码

    机械设计无阀滤池-30Tsw16可编辑非常好的设计图纸100%好用.zip

    机械设计无阀滤池-30Tsw16可编辑非常好的设计图纸100%好用.zip

    机械设计RJ45安防线连接器焊锡机sw18可编辑非常好的设计图纸100%好用.zip

    机械设计RJ45安防线连接器焊锡机sw18可编辑非常好的设计图纸100%好用.zip

    SwiftUI嵌入UIKit(SwiftUI顺传值到UIKit)

    SwiftUI嵌入UIKit(SwiftUI顺传值到UIKit)

    node-v12.18.4-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Python代码实现基于朴素贝叶斯算法的垃圾邮件分类(源码+全部数据)

    当处理垃圾邮件分类问题时朴素贝叶斯算法是一种经典且常用的方法。朴素贝叶斯算法基于贝叶斯定理特征条件独立性假设,能够高效地处理文本分类问题。 以下是一个使用Python实现基于朴素贝斯算法的垃圾邮件分类的示例: 1. 数据准备: 首先,需要准备训练数据集和测试数据集。训练数据集包含已标记的垃圾邮件和非垃圾邮件的文样本,通过这些样本进行模型训练。测试数据集用于评估模型的性能。 2. 数据预处理: 将文本样本转换为特征向量是朴素贝叶斯算法的关键步骤。可以使用词袋模型或者TF-IDF等方法将文本样本表示为向量。 3. 特征选择: 根据问题的具体特点,可以选择保留所有特征或者进行特征选择。常见的特征选择方法有卡方检验、互信息等。 4. 模型训练: 使用训练数据集训练朴素贝叶斯分类模型。常见的朴素贝叶斯分类器有多项式朴素贝叶斯、伯努利朴素贝叶斯和高斯朴素贝叶斯等。 5. 模型评估: 使用测试数据集评估模型的性能,常见的评估指标包括准确率、召回率、精确率和F1值等。 下面是一个简单的Python实现示例: ```python import numpy as np from

    httpsyy70958.com29875videoplayvid45958.m3u8..m3u

    httpsyy70958.com29875videoplayvid45958.m3u8..m3u

    Java 三维装箱代码示例

    在Java中,实现一个三维装箱(也称为三维背包问题)的算法通常涉及到组合优化和动态规划。这个问题是一个典型的优化问题,其中目标是在三个维度的限制下最大化价值的总和。下面是一个简单的Java代码示例,它使用动态规划来解决三维装箱问题。 请注意,这个代码只是一个简单的示例,它假设所有物品的第三个维度的大小都是1,并且没有给出如何回溯选择物品的完整逻辑。在实际应用中,三维装箱问题可能更加复杂,需要考虑所有三个维度的限制,并且可能需要更复杂的算法来解决。 此外,这个问题的解决方案可能需要根据具体问题的要求进行调整,例如物品是否可以分割、是否允许超过一个的物品等。如果你有特定的问题描述或者需要进一步的帮助,请提供更多的细节。

    BCSP-X 2024年活动文件,包含活动范围和模拟题

    北京市中小学信息学能力测评活动(BCSP-X)活动范围和模拟题目,包含基础知识题目和测试点题目

    商业模式画布——如何找到独特价值定位.docx

    商业模式画布——如何找到独特价值定位.docx

    SITOP 电源电源电源电源 20 6EP1 536-2AA00 操作手册

    SITOP 电源电源电源电源 20 6EP1 536-2AA00 操作手册

Global site tag (gtag.js) - Google Analytics