Qt没有编码' +'符号

时间:2016-04-11 14:09:16

标签: qt encoding

为什么没有Qt5编码加号到%2B?

我已尝试过此代码:

QUrlQuery urlQuery;
urlQuery.addQueryItem("test", "hello+world");
manager->post(request, urlQuery.toString(QUrl::FullyEncoded).toUtf8());

但是在服务器方面,我总是得到如下字符串:

hello world

没有%2B且没有加号。所以我不能得到一个' +'在服务器端签名......

如何使用Qt5发送加号?

2 个答案:

答案 0 :(得分:5)

  

如何使用Qt5发送加号?

请勿使用post数据的网址,使用QByteArray。它将按原样发送。

修改

QUrlQuery的其他信息,+号是特殊情况(来自文档):

  

处理空格和加号(“+”)

     

Web浏览器通常将HTML FORM元素中的空格编码为a   加号(“+”)和加号以百分比编码形式(%2B)。   但是,不考虑管理URL的Internet规范   空格和加号等价物。出于这个原因,QUrlQuery   永远不会将空格字符编码为“+”,永远不会将“+”解码为   空间角色。相反,空格字符将呈现为“%20”   编码形式。为了支持像HTML表单那样的编码,QUrlQuery   也从不将“%2B”序列解码为加号,也不编码加号   标志。事实上,在键,值,任何“%2B”或“+”序列,   或者查询字符串与写入完全相同(除了   大写“%2b”到“%2B”)。

因此,如果您想对包含+符号的字符串使用QUrlQuery,您似乎必须自己进行编码("+" => "%2B"),您可以使用静态方法QUrl::toPercentEncoding()

答案 1 :(得分:0)

使用PyQt 5和Python 2.7,尽管本页其他地方的Ilya提供了有用的answer,但这对我来说有点困难。

这是最终对我有用的(OP的示例转换为Python2.7 / PyQt5):

url_query = QUrlQuery()
url_query.addQueryItem('test', str(QtCore.QUrl.toPercentEncoding('hello+world')))
manager.post(request, str(url_query.toString(QUrl.FullyEncoded)))

以下是使用httpbin.org检查发布内容的完整示例:

import sys
import json
from PyQt5 import QtCore, QtWidgets, QtNetwork


def slot_finished(reply):
    """ Get form data from reply content """
    reply_content = json.loads(str(reply.readAll()))
    print 'returned: {}'.format(reply_content['form'][KEY])


# Some variables
url = u'http://httpbin.org/post'
content_type = u'application/x-www-form-urlencoded'
KEY = 'test'
data = u'hello + world'

# Build content for the request
url_query = QtCore.QUrlQuery()
url_query.addQueryItem(KEY, str(QtCore.QUrl.toPercentEncoding(data)))
content = str(url_query.toString(QtCore.QUrl.FullyEncoded))

# Post the request and show the reply content
app = QtWidgets.QApplication(sys.argv)
manager = QtNetwork.QNetworkAccessManager()
manager.finished.connect(slot_finished)
manager.finished.connect(app.quit)  # relies on connection order
request = QtNetwork.QNetworkRequest(QtCore.QUrl(url))
request.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, content_type)
reply = manager.post(request, content)
print 'expected: {}'.format(data)
app.exec_()

注意:不确定原因,但该示例似乎也可以在没有明确设置QtCore.QUrl.FullyEncoded的情况下工作。以下是Qt docs关于该常数的说法:

  

将所有字符保留为正确编码的形式,作为此组件   将显示为URL的一部分。当与toString()一起使用时,这个   以QString形式生成完全兼容的URL,完全等于   toEncoded()的结果