Qt不编码'+';签名

Qt不编码'+';签名,qt,encoding,Qt,Encoding,为什么Qt5不将加号编码为%2B 我尝试过以下代码: QUrlQuery urlQuery; urlQuery.addQueryItem("test", "hello+world"); manager->post(request, urlQuery.toString(QUrl::FullyEncoded).toUtf8()); 但在服务器端,我总是得到如下字符串: hello world 没有%2B和加号。所以我在服务器端找不到“+”符号 如何发送带有Qt5的加号 如何发送带有Qt5的加

为什么Qt5不将加号编码为%2B

我尝试过以下代码:

QUrlQuery urlQuery;
urlQuery.addQueryItem("test", "hello+world");
manager->post(request, urlQuery.toString(QUrl::FullyEncoded).toUtf8());
但在服务器端,我总是得到如下字符串:

hello world

没有%2B和加号。所以我在服务器端找不到“+”符号

如何发送带有Qt5的加号

如何发送带有Qt5的加号

不要为
post
数据使用url,请使用
QByteArray
。它将按原样发送

编辑

关于
QUrlQuery
的附加信息,+符号是一种特殊情况(来自文档):

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

Web浏览器通常将HTML表单元素中的空格编码为 加号(“+”)和加号到其百分比编码形式(%2B)。 然而,管理URL的Internet规范没有考虑。 空格和加号等效。因此,QUrlQuery 从不将空格字符编码为“+”,也不会将“+”解码为“+” 空格字符。相反,空格字符将在中呈现“%20” 编码形式。为了支持像HTML表单那样的编码,QUrlQuery 此外,决不将“%2B”序列解码为加号,也不对加号进行编码 签名事实上,在键、值、, 或查询字符串与写入的字符串完全相同(除了 “%2b”至“%2b”的上套管


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

使用PyQt 5和Python2.7,这对我来说是一个难题,尽管Ilya在本页其他地方提供了帮助

以下是最终对我有效的方法(OP的示例转换为Python2.7/PyQt5):

下面是一个用于检查发布内容的完整示例:

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的情况下也能工作。下面是关于这个常数的一些看法:

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


相关:为什么要将url转换为字符串而不是使用
QNetworkRequest::setUrl
?因为它不是用于url的。这是用来发布数据的。我已经试过你说的了<代码>QByteArray数据发送(“POSTDATA=hello+world”);经理->发布(请求、数据发送)
在服务器端,我得到:
POSTDATA:hello world
没有加号。@Mike您如何定义
ContentTypeHeader
,它是“application/Json”吗?如果是Json,您是否可以使用
QJsonDocument.toJson()
,在有效的Json文档中发送数据?我使用
request.setHeader(QNetworkRequest::ContentTypeHeader,“application/x-www-form-urlencoded”)否则我无法将带有参数的post数据发送到服务器。@Mike。哦,我明白了,让我检查一下。只有我一个人…这是qt的错误吗?为什么对其他simbol进行编码?
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_()