2012-07-28 53 views
1

我想傳遞一個參數到python cgi腳本,這個參數包含加號運算符。Python的CGI腳本,我不能通過'+'加運算符作爲參數

/cgi-bin/test.py?input=print%20"%20"%20"%20%20-+-\" 

蟒蛇CGI腳本很簡單:

#!/usr/bin/python -w 
import cgi 
fs = cgi.FieldStorage() 

print "Content-type: text/plain\n" 
strE=fs.getvalue("input") 
print strE 

我的輸出是:

print " " " - -\" 

我不明白爲什麼 '+' 加運算由空間取代, 我怎樣才能通過'+'加操作符?

編輯

@湯姆·安德森,回答我的問題,我想延長我的問題多一點。

我有一個調用獲取URL與參數的Java腳本函數:

  <script type="text/javascript"> 

      function PostContentEditable(editableId,targetOutput) 
      { 
         var texthtml = document.getElementById(editableId).innerHTML 
         var tmp = document.createElement("DIV"); 
         tmp.innerHTML = texthtml ; 
         var str= tmp.textContent||tmp.innerText; 

         var xmlhttp; 
         if (str.length == 0){ 
          document.getElementById(targetOutput).innerHTML = ""; 
          return; 
         } 
         if(window.XMLHttpRequest){ 
          xmlhttp=new XMLHttpRequest(); 
         } 
         else{ 
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
         } 
         xmlhttp.onreadystatechange=function(){ 
          if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
           document.getElementById(targetOutput).innerHTML=xmlhttp.responseText; 
          } 
         } 

         xmlhttp.open("GET","../cgi-bin/exercise.py?input="+str,true); 
         xmlhttp.send(); 
      } 
      </script> 

是否有自動的內置函數替換所有的特殊字符我所需要的?

str = escapeStringToNativeUrl(str) ? 

回答

5

在URL的查詢部分,+是一個特殊的代碼,表示空格。

這是因爲關於表單的HTML規範的一部分指定了form data is encoded as application/x-www-form-urlencoded in a query string。在那個編碼中,space characters are replaced by `+'

所以,Python正確地解碼你的輸入。

如果您想通過實際加號,您需要將percent-encode設爲%2B

在JavaScript中,我相信the right way to build the query string is with encodeURIComponent

+0

謝謝,很好的答案,我可以找到那些特殊字符的捷徑? – Michael 2012-07-28 08:22:10

+0

我編輯了我的問題,是否有任何java-script中的函數將我的字符串轉換爲正確的url? – Michael 2012-07-28 08:33:21

+1

空間是唯一獲得特殊待遇的人。對於其他任何事情,如果它是[未經保留的字符](http://tools.ietf.org/html/rfc3986#section-2.3),您可以按原樣使用它,如果不是,它需要進行百分比編碼。 – 2012-07-28 08:38:37