Requests: UnicodeEncodeError: لا يمكن لبرنامج الترميز "latin-1" ترميز الأحرف

تم إنشاؤها على ٢٠ ديسمبر ٢٠١٣  ·  7تعليقات  ·  مصدر: psf/requests

الطلبات هي أحدث إصدار.
عندما أحاول نشر البيانات التي تحتوي على الحرف الصيني ، يتم طرح هذا الاستثناء.

Traceback (most recent call last):
  File "X/threading.py", line 639, in _bootstrap_inner
  File "X/threading.py", line 596, in run
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\salesforce\api.py", line 546, in execute_anonymous
    headers=headers)
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\api.py", line 88, in post
    return request('post', url, data=data, **kwargs)
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\sessions.py", line 338, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\sessions.py", line 441, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\adapters.py", line 292, in send
    timeout=timeout
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\packages\urllib3\connectionpool.py", line 428, in urlopen
    body=body, headers=headers)
  File "C:\Users\Administrator\Dropbox\Sublime3056\Data\Packages\SublimeApex\requests\packages\urllib3\connectionpool.py", line 280, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "X/http/client.py", line 1049, in request
  File "X/http/client.py", line 1086, in _send_request
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 1632-1633: ordinal not in range(256)

التعليق الأكثر فائدة

إذن ، ST 3 ، لكن ليس أحدث مراجعة. حسنًا ، هذا يعطينا شيئًا. على وجه التحديد ، يستخدم Sublime Text 3 Python 3.3 ، وليس Python 2.7 (الذي استخدمه Sublime Text 2). هذا يعني أن جميع السلاسل الافتراضية في Sublime Apex هي سلاسل يونيكود.

إذا فتحت ملف Python 3.3 http.client ، فستجد أن وظيفة _send_request() تبدو كما يلي:

# Honor explicitly requested Host: and Accept-Encoding: headers.
header_names = dict.fromkeys([k.lower() for k in headers])
skips = {}
if 'host' in header_names:
    skips['skip_host'] = 1
if 'accept-encoding' in header_names:
    skips['skip_accept_encoding'] = 1

self.putrequest(method, url, **skips)

if body is not None and ('content-length' not in header_names):
    self._set_content_length(body)
for hdr, value in headers.items():
    self.putheader(hdr, value)
if isinstance(body, str):
    # RFC 2616 Section 3.7.1 says that text default has a
    # default charset of iso-8859-1.
    body = body.encode('iso-8859-1')
self.endheaders(body)

الآن ، ISO-8859-1 هو اسم مستعار لـ Latin-1 ، وهو برنامج الترميز الذي نواجه مشكلة معه. المشكلة التي نواجهها هي أن Sublime Apex توفر نصًا لسلسلة Unicode للطلبات ، والذي يحتاج HTplib لترميزه إلى بايت. بأخذ الخيار الافتراضي من RFC 2616 ، فإنه يخلص إلى أنك تريد Latin-1 ، والذي لا يتضمن أي أحرف صينية. من الواضح إذن ، فشل الترميز ، وتحصل على الاستثناء المعني.

بالنظر إلى أن شركة Sublime Apex تدعي في الترويسات التي ترسلها لإرسال بيانات مشفرة UTF-8 (وهي كذبة حاليًا) ، فإن Sublime Apex تريد ترميز البيانات كـ UTF-8 قبل إرسالها. هذا يعني أن أي خط يرسل البيانات (في هذه الحالة السطر 545 من salesforce/api.py ) يجب أن يقرأ على النحو التالي:

response = requests.post(self.apex_url, soap_body.encode('utf-8'), verify=False, headers=headers)

من أجل أي شخص آخر يريد تأكيد تشخيصي ، إليك جزء سريع من نموذج التعليمات البرمجية الذي يؤكد المشكلة:

a = "\u13E0\u19E0\u1320"
a.encode('latin1')  # Throws UnicodeEncodeError, proves that this can't be expressed in ISO-8859-1.
a.encode('utf-8')  # Totally fine.
r = requests.post('http://httpbin.org/post', data=a)  # Using unicode string, throws UnicodeEncodeError blaming Latin1.
r = requests.post('http://httpbin.org/post', data=a.encode('utf-8'))  # Works fine.

شكرًا لرفع هذا الأمر معنا ، لكن هذا ليس خطأ في الطلبات. =)

ال 7 كومينتر

ملف "X / http / client.py"

هل كتبت X لأن هذا مسار لملف محلي؟ إذا كان الأمر كذلك ، فقد تكون بنية الدليل لديك مربكة لـ urllib3. إذا لم يكن الأمر كذلك ، فمن المحتمل أن تثير هذا الأمر على bugs.python.org لأن هذا ليس شيئًا أعتقد أنه يجب التعامل مع الطلبات. يبدو أن هذا يرتفع من httplib (أو http على Python 3 الذي أعتقد أنك تستخدمه).

@ sigmavirus24 ،

لقد استخدمت الطلبات في المكون الإضافي السامي ، إذا لم يحتوي Soap_body في العبارة أدناه على أي أحرف صينية ، فلن يكون هناك استثناء.

response = requests.post(self.apex_url, soap_body, verify=False, headers=headers)

أولاً ، ما لم تكن تستخدم إصدارًا مختلفًا من Sublime Apex عن الإصدار الموجود في المستودع العام ، فإن الطلبات ليست هي الإصدار الأحدث ، إنها الإصدار 1.2.3. هل يمكن أن تخبرني ما هو إصدار Sublime Text الذي تستخدمه؟

إنه نص سامي 3056

إذن ، ST 3 ، لكن ليس أحدث مراجعة. حسنًا ، هذا يعطينا شيئًا. على وجه التحديد ، يستخدم Sublime Text 3 Python 3.3 ، وليس Python 2.7 (الذي استخدمه Sublime Text 2). هذا يعني أن جميع السلاسل الافتراضية في Sublime Apex هي سلاسل يونيكود.

إذا فتحت ملف Python 3.3 http.client ، فستجد أن وظيفة _send_request() تبدو كما يلي:

# Honor explicitly requested Host: and Accept-Encoding: headers.
header_names = dict.fromkeys([k.lower() for k in headers])
skips = {}
if 'host' in header_names:
    skips['skip_host'] = 1
if 'accept-encoding' in header_names:
    skips['skip_accept_encoding'] = 1

self.putrequest(method, url, **skips)

if body is not None and ('content-length' not in header_names):
    self._set_content_length(body)
for hdr, value in headers.items():
    self.putheader(hdr, value)
if isinstance(body, str):
    # RFC 2616 Section 3.7.1 says that text default has a
    # default charset of iso-8859-1.
    body = body.encode('iso-8859-1')
self.endheaders(body)

الآن ، ISO-8859-1 هو اسم مستعار لـ Latin-1 ، وهو برنامج الترميز الذي نواجه مشكلة معه. المشكلة التي نواجهها هي أن Sublime Apex توفر نصًا لسلسلة Unicode للطلبات ، والذي يحتاج HTplib لترميزه إلى بايت. بأخذ الخيار الافتراضي من RFC 2616 ، فإنه يخلص إلى أنك تريد Latin-1 ، والذي لا يتضمن أي أحرف صينية. من الواضح إذن ، فشل الترميز ، وتحصل على الاستثناء المعني.

بالنظر إلى أن شركة Sublime Apex تدعي في الترويسات التي ترسلها لإرسال بيانات مشفرة UTF-8 (وهي كذبة حاليًا) ، فإن Sublime Apex تريد ترميز البيانات كـ UTF-8 قبل إرسالها. هذا يعني أن أي خط يرسل البيانات (في هذه الحالة السطر 545 من salesforce/api.py ) يجب أن يقرأ على النحو التالي:

response = requests.post(self.apex_url, soap_body.encode('utf-8'), verify=False, headers=headers)

من أجل أي شخص آخر يريد تأكيد تشخيصي ، إليك جزء سريع من نموذج التعليمات البرمجية الذي يؤكد المشكلة:

a = "\u13E0\u19E0\u1320"
a.encode('latin1')  # Throws UnicodeEncodeError, proves that this can't be expressed in ISO-8859-1.
a.encode('utf-8')  # Totally fine.
r = requests.post('http://httpbin.org/post', data=a)  # Using unicode string, throws UnicodeEncodeError blaming Latin1.
r = requests.post('http://httpbin.org/post', data=a.encode('utf-8'))  # Works fine.

شكرًا لرفع هذا الأمر معنا ، لكن هذا ليس خطأ في الطلبات. =)

شكرا.

r = request.post (' http://httpbin.org/post '، data = a.encode ('utf-8'))
مفيد جدا،
اشكرك!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

ghtyrant picture ghtyrant  ·  3تعليقات

avinassh picture avinassh  ·  4تعليقات

remram44 picture remram44  ·  4تعليقات

mitar picture mitar  ·  4تعليقات

iLaus picture iLaus  ·  3تعليقات