Version: Python 2.7.3Python yêu cầu dữ liệu POST mã hóa
thư viện khác: Python-Các yêu cầu 1.2.3, jinja2 (2,6)
Tôi có một kịch bản mà nộp dữ liệu vào một diễn đàn và vấn đề là các ký tự không phải ascii xuất hiện dưới dạng rác. Ví dụ, một cái tên như André Téchiné xuất hiện như là André © Tà © chinà ©.
Dưới đây là cách dữ liệu được nộp:
1) Dữ liệu ban đầu được nạp từ một tập tin CSV UTF-8 mã hóa như sau:
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 là từ dưới cùng của trang tài liệu Python CSV: http://docs.python.org/2/library/csv.html
Khi tôi nhập tên mục trong trình thông dịch, tôi thấy tên là u'Andr\xe9 T\xe9chin\xe9'
.
2) Tiếp theo, tôi làm cho dữ liệu thông qua jinja2:
tpl = tpl_env.get_template(u'forumpost.html')
rendered = tpl.render(entries=entries)
Khi tôi gõ tên render trong thông dịch viên tôi thấy một lần nữa giống nhau: u'Andr\xe9 T\xe9chin\xe9'
Bây giờ, nếu tôi viết biến render để một tên tập tin như thế này, nó sẽ hiển thị một cách chính xác:
with codecs.open('out.txt', 'a', 'utf-8') as f:
f.write(rendered)
Nhưng tôi phải gửi nó đến diễn đàn:
3) Trong các mã yêu cầu POST tôi có:
params = {u'post': rendered}
headers = {u'content-type': u'application/x-www-form-urlencoded'}
session.post(posturl, data=params, headers=headers, cookies=session.cookies)
phiên là một phiên yêu cầu.
Và tên được hiển thị bị hỏng trong bài đăng trên diễn đàn. Tôi đã thử những điều sau đây:
- header Bỏ
- Encode render như rendered.encode ('utf-8') (tương tự kết quả)
- render = urllib.quote_plus (render) (đi ra như tất cả% XY)
Nếu tôi gõ rendered.encode ('utf-8') tôi thấy như sau:
'Andr\xc3\xa9 T\xc3\xa9chin\xc3\xa9'
Làm sao tôi khắc phục vấn đề? Cảm ơn.
"kiểm tra vấn đề này không phải là một vật phẩm trưng bày ví dụ, giá trị là đúng nhưng nó hiển thị không chính xác "- Cảm ơn bạn. Đó chính là vấn đề! Rất tiếc, đó là diễn đàn công khai và tôi không thể thay đổi mã hóa mặc định. Nó đáp ứng với mã hóa iso-8859-1. Tôi có thể sử dụng rendered.encode ('iso-8859-1') hay điều đó sẽ phá vỡ mọi thứ? Cảm ơn. – TheMagician
cố gắng đặt bộ ký tự trong tiêu đề – jfs
Điều đó không hoạt động. – TheMagician