2016-04-11 15 views
3

Qt5でプラス記号を%2Bにエンコードしないのはなぜですか?Qtは '+'記号をエンコードしません

私はこのコードを試してみた:

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

をしかし、サーバの側で、私はいつものような文字列を取得します。%2​​Bなしとプラス記号なし

hello world

を。だから私はサーバー側に '+'サインを得ることができません...

Qt5でプラス記号を送信するにはどうしたらいいですか?

+0

関連性:http://stackoverflow.com/questions/24343582/convert-qurl-with-percent-encoding-into-string?rq=1 – IAmInPLS

+1

なぜQNetworkRequestを使用する代わりにURLを文字列に変換していますか? :setUrl'? – Ilya

+0

URLにはなりません。それはポストデータ用です。 – Mike

答えて

3

Qt5でプラス記号を送信するにはどうすればよいですか?

postデータにURLを使用しないでください。QByteArrayを使用してください。それはそのまま送られます。 QUrlQueryため

EDIT

追加情報、+記号(DOC)から特殊なケースである:スペースとプラスの

取扱い( "+")

Webブラウザは、通常、HTMLフォームの要素にある空白を に符号( "+")、プラス記号にパーセント符号化形式(%2B)を符号化します。 しかし、URLを管理するインターネット仕様では、 スペースと同等のプラス文字は考慮されません。そのため、QUrlQuery は空白文字を "+"にエンコードしません。また、 "+"を空白文字 にデコードしません。代わりに、空白文字は エンコードされた形式で "%20"にレンダリングされます。 HTMLフォームのようなエンコーディングをサポートするために、QUrlQuery は "%2B"シーケンスをプラス記号にデコードせず、プラス記号 をエンコードもしません。実際には、キー、値、 またはクエリ文字列に含まれる "%2B"または "+"シーケンスは、全く同じように書かれています( "%2b"から "%2B"への の大文字を除く)。

あなたは+印を含む文字列にQUrlQueryを使用したいのであれば、あなたが自分自身("+" =>"%2B")、あなたはそのための静的メソッドQUrl::toPercentEncoding()を使用することができますエンコードを行う必要がありそうです。

+0

私はあなたが言った方法を試しました。 'QByteArray dataToSend(" POSTDATA = hello + world "); manager-> post(request、dataToSend); 'サーバー側で、私は「POSTDATA:hello world」をプラス記号なしで再度取得しました。 – Mike

+0

@Mike 'ContentTypeHeader'はどのように定義しましたか?application/Jsonですか?それがJsonならば、あなたは 'QJsonDocument.toJson()'を使って有効なJsonの文書にあなたのデータを送ることができますか? – Ilya

+0

私は 'request.setHeader(QNetworkRequest :: ContentTypeHeader、" application/x-www-form-urlencoded ");を使用します。そうでなければ、パラメータを持つ投稿データをサーバに送ることができません。 @Mike。 – Mike

関連する問題