我有一个西里尔字符串,我希望使用Python请求以Windows-1251编码的形式发送。
看一下这个例子:
import requests
st = 'Искать'
requests.post('http://localhost:8888', data={'test': st})
但是,请求的数据变为此(运行nc -l 8888
以查看请求):
test=%D0%98%D1%81%D0%BA%D0%B0%D1%82%D1%8C
这是我的目标字符串,编码为UTF-8,我们可以轻松检查:
>>> from urllib.parse import quote
>>> st = 'Искать'
>>> quote(st, encoding='utf-8') # Matches
'%D0%98%D1%81%D0%BA%D0%B0%D1%82%D1%8C'
>>> quote(st, encoding='cp1251') # Doesn't match
'%C8%F1%EA%E0%F2%FC'
现在我想如果我自己编码数据,那就可以了。
requests.post('http://localhost:8888', data={'test': quote(st, encoding='cp1251')})
但事实证明情况并非如此,因为在字母编码时,百分号再次编码为UTF-8(%25
),整个字符串再次无效
test=%25C8%25F1%25EA%25E0%25F2%25FC
所以我正在寻找一种方法来禁用内置的请求编码功能或覆盖编码值。我该怎么办?
我正在使用Python 3.5,请求2.18.4
答案 0 :(得分:0)
有时您可能希望发送非表单编码的数据。如果传入字符串而不是dict,则会直接发布该数据。
因此,如果您不希望数据进行表单编码,则应使用字符串。
st = 'Искать'
data={'test': quote(st, encoding='cp1251')}
data = '&'.join('='.join(i) for i in data.items())
requests.post('http://localhost:8888', data=data)