为什么没有Qt5编码加号到%2B?
我已尝试过此代码:
QUrlQuery urlQuery;
urlQuery.addQueryItem("test", "hello+world");
manager->post(request, urlQuery.toString(QUrl::FullyEncoded).toUtf8());
但是在服务器方面,我总是得到如下字符串:
hello world
没有%2B且没有加号。所以我不能得到一个' +'在服务器端签名......
如何使用Qt5发送加号?
答案 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()的结果