2013-07-02 8 views
20

संस्करण: अजगर 2.7.3अजगर अनुरोध एन्कोडिंग पोस्ट डेटा

अन्य पुस्तकालयों: अजगर-अनुरोध 1.2.3, jinja2 (2,6)

मैं एक स्क्रिप्ट है कि एक मंच करने के लिए डेटा प्रस्तुत किया है और समस्या यह है कि गैर-असीसी पात्र कचरे के रूप में दिखाई देते हैं। उदाहरण के लिए एंड्रे टेचिन जैसे नाम एंड्रै © Tà © chinà © के रूप में बाहर आते हैं।

यहां बताया गया है डेटा प्रस्तुत किया जाता है:

1) डाटा शुरू में तो जैसे एक UTF-8 एन्कोडेड CSV फ़ाइल से भरी हुई है:

entries = [] 
with codecs.open(filename, 'r', 'utf-8') as f: 
    for row in unicode_csv_reader(f.readlines()[1:]): 
     entries.append(dict(zip(csv_header, row))) 

unicode_csv_reader अजगर सीएसवी प्रलेखन पेज के नीचे से है: http://docs.python.org/2/library/csv.html

जब मैं दुभाषिया में प्रविष्टियों का नाम टाइप करता हूं, तो मुझे नाम u'Andr\xe9 T\xe9chin\xe9' के रूप में दिखाई देता है। फिर से वही

tpl = tpl_env.get_template(u'forumpost.html') 
rendered = tpl.render(entries=entries) 

जब मैं नाम दुभाषिया में गाया टाइप मैं देख रहा हूँ:

2) अगला मैं jinja2 के माध्यम से डाटा प्रस्तुत करना u'Andr\xe9 T\xe9chin\xe9'

अब, अगर मैं गाया चर को लिखने इस तरह की एक फ़ाइल नाम, इसे सही ढंग से प्रदर्शित करता है:

with codecs.open('out.txt', 'a', 'utf-8') as f: 
    f.write(rendered) 

लेकिन मैं इसे मंच करने के लिए भेजना चाहिए:

3) पोस्ट अनुरोध कोड में मेरे पास है:

params = {u'post': rendered} 
headers = {u'content-type': u'application/x-www-form-urlencoded'} 
session.post(posturl, data=params, headers=headers, cookies=session.cookies) 

सत्र एक अनुरोध सत्र है।

और नाम फ़ोरम पोस्ट में टूटा हुआ प्रदर्शित होता है। मैं निम्नलिखित की कोशिश की है:

  • हेडर बाहर छोड़ दें
  • एनकोड rendered.encode रूप में प्रदान की ('utf-8') (एक ही परिणाम)
  • गाया = urllib.quote_plus (गाया) (बाहर के रूप में आता सभी% XY)

अगर मैं टाइप rendered.encode ('utf-8') मैं निम्न देखें:

'Andr\xc3\xa9 T\xc3\xa9chin\xc3\xa9' 

मैं कैसे इस मुद्दे को ठीक कर सकता है? धन्यवाद।

unicode(my_string_variable, "utf8") 

या डीकोड और इनकोड: UTF8 में डिकोड करने के लिए

उत्तर

24

आपका क्लाइंट बर्ताव करता है के रूप में यह उदा चाहिएnc -l 8888 एक सर्वर के रूप में चल रहा है और बनाने के लिए एक अनुरोध:

import requests 

requests.post('http://localhost:8888', data={u'post': u'Andr\xe9 T\xe9chin\xe9'}) 

शो:

POST/HTTP/1.1 
Host: localhost:8888 
Content-Length: 33 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate, compress 
Accept: */* 
User-Agent: python-requests/1.2.3 CPython/2.7.3 

post=Andr%C3%A9+T%C3%A9chin%C3%A9 

आप देख सकते हैं कि यह सही है:

>>> import urllib 
>>> urllib.unquote_plus(b"Andr%C3%A9+T%C3%A9chin%C3%A9").decode('utf-8') 
u'Andr\xe9 T\xe9chin\xe9' 
  • जांच सर्वर अनुरोध डीकोड सही ढंग से। आप अक्षरसेट निर्दिष्ट की कोशिश कर सकते: तो यह चोट नहीं करना चाहिए और सही सर्वर x-www-form-urlencoded प्रकार के लिए कोई पैरामीटर वैसे भी उपेक्षा करेंगे

    headers = {"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"} 
    

    शरीर केवल ASCII वर्ण हैं। में URL-encoded form data

  • जांच रक्तमय विवरण के लिए देखो मुद्दा एक प्रदर्शन शिल्पकृति यानी नहीं है, मूल्य सही है, लेकिन यह गलत तरीके से प्रदर्शित करता है

+0

"जाँच मुद्दा एक प्रदर्शन शिल्पकृति यानी नहीं है, मूल्य सही है लेकिन यह गलत तरीके से प्रदर्शित करता है "- धन्यवाद। यही समस्या है! दुर्भाग्य से यह एक सार्वजनिक मंच है और मैं डिफ़ॉल्ट एन्कोडिंग नहीं बदल सकता। यह आईएसओ -885 9 -1 एन्कोडिंग के साथ प्रतिक्रिया करता है। क्या मैं rendered.encode ('iso-8859-1') का उपयोग कर सकता हूं या क्या चीजों को तोड़ देगा? धन्यवाद। – TheMagician

+1

शीर्षलेखों में वर्णमाला सेट करने का प्रयास करें – jfs

+0

यह काम नहीं किया। – TheMagician

1

कोशिश

sometext = gettextfromsomewhere().decode('utf-8') 
env = jinja2.Environment(loader=jinja2.PackageLoader('jinjaapplication', 'templates')) 
template = env.get_template('mypage.html') 
print template.render(sometext = sometext).encode('utf-8') 
संबंधित मुद्दे