سؤال

قمت ببعض البرنامج النصي في Python الذي يتصل بـ Gmail وطباعة نص بريد إلكتروني ... ولكن في كثير من الأحيان تحتوي رسائل البريد الإلكتروني الخاصة بي على كلمات "لهجة". وهناك مشكلتي ...

على سبيل المثال ، نص حصلت عليه: "plano de s = c3 = 9ade" يجب أن تتم طباعتها على أنها "بلانو دي سايدي".

كيف يمكنني تحويل نص بريدي الإلكتروني المقروء؟ ما الذي يمكنني استخدامه لتحويل رسائل الرسائل بلكنة؟

شكرًا،


الرمز الذي اقترحه أندري ، يعمل بشكل جيد على Windows ، ولكن على Linux ما زلت أحصل على الطباعة الخاطئة:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÃDE

رافائيل ،

شكرًا ، أنت محق في الكلمة ، لقد تم إملائها في أخطاء إملائية. لكن المشكلة لا تزال هي نفسها هنا. مثال آخر: الكلمة الصحيحة: Obersevaço

>>> b = 'Observa=C3=A7=C3=B5es'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
Observações

أنا أستخدم Debian مع Locale UTF-8:

>>> :~$ locale
LANG=en_US.UTF-8

أندريه ،

شكرا على وقتك. وأنا أتفق مع شرحك ، ولكن لا يزال مع نفس المشكلة هنا. ألقِ نظرة على اختباري:

   s='Observa=C3=A7=C3=B5es'
   s2= s.decode('quopri').decode('utf-8')

   >>> print s

   Observa=C3=A7=C3=B5es

   >>> print s2

   Observações

   >>> import locale

   >>> ENCODING = locale.getpreferredencoding()

   >>> print s.encode(ENCODING)
   Observa=C3=A7=C3=B5es

   >>> print s2.encode(ENCODING)
   Observações

   >>> print ENCODING
   UTF-8
هل كانت مفيدة؟

المحلول

هذا الترميز يسمى مقتبسة. في مثالك ، لديك سلسلة (بيثون unicode) مشفرة في بايت UTF-8 (Python's str) مشفرة في بايتات قابلة للطباعة مقتبسة. لذا فإن الطريقة الصحيحة للحصول على قيمة سلسلة هي:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE

تحديث: قد يكون هناك بعض المشكلات مع وحدة التحكم Conding رغم ذلك. s يحمل قيمة سلسلة Unicode صحيحة تمامًا (من نوع Python unicode). ولكن عندما تستخدم print البيان ، القيمة يجب يتم تحويلها إلى بايت (بيثون str) من أجل كتابتها إلى رقم واصف ملف OS 1 (أنبوب الإخراج القياسي). لذلك print يقوم تنفيذ البيانات بالتحقق من ترميز وحدة التحكم الخاصة بك ، ثم يجعل بعض التخمينات وتطبع النتائج. في الواقع ، في Python 2 ، ستكون النتائج مختلفة للطباعة من الصدفة التفاعلية ، وتشغيل العملية بشكل غير متداخل وتشغيل العملية الخاصة بك أثناء إعادة توجيه الإخراج إلى ملف.

لا يتم الاتفاق على أفضل طريقة لإخراج السلاسل المشفرة في بيثون 2. طريقتان أكثر منطقية هما:

1) الاستخدام localeترميز التخمين وترميز الأوتار يدويًا.

import locale
ENCODING = locale.getpreferredencoding()

print s.encode(ENCODING)

2) استخدم خيار الترميز (سطر الأوامر ، أو مشفرًا أو أي شيء آخر).

from getopt import getopt
ENCODING = 'UTF-8'
opts, args = getopt(sys.argv[1:], '', ['encoding='])
for opt, arg in opts:
    if opt == '--encoding':
        ENCODING = arg

print s.encode(ENCODING)

تحديث 2: إذا لم يكن هناك شيء يساعد وما زلت متأكدًا من ضبط وحدة التحكم الخاصة بك وخطها على UTF-8 ، فحسب ذلك: جرب هذا:

import sys, os
ENCODING = 'UTF-8'
stdout = os.fdopen(sys.stdout.fileno(), 'wb')
s = u'привет' # Don't forget to use a Unicode literal staring with u''
stdout.write(s.encode(ENCODING))

في هذه المرحلة يجب انظر الكلمة الروسية привет في حرف السيريليك في وحدة التحكم الخاصة بك :)

إذا كان هذا هو الحال ، فيجب عليك استخدام هذا الثنائي stdout بدلا من الطبيعي sys.stdout.

نصائح أخرى

سلسلتك خاطئ ، انظر:

'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'

أين هو "أ" المفقود في سايدي؟

إذا كنت فك تشفير 'PLANO DE S=C3=9ADE' باعتباره مقتبسًا ، ستحصل فقط على "بلانو دي سد".

تشغيل هذا الرمز هنا على Linux (Ubuntu 9.10):

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top