Fabric: UnicodeEncodeError خطأ عند استدعاء دالة puts مع unicode u '\ xff' و stream.encoding هو بلا

تم إنشاؤها على ٨ أبريل ٢٠١٥  ·  5تعليقات  ·  مصدر: fabric/fabric

أهلا،
عند استبدال المتغير s بقيمة أخرى u '\ xff' ، سيفشل هذا الاختبار.

[حالة اختبار]

@mock_streams('stdout')
def test_puts_with_encoding_type_none_output():
    """
    puts() should print unicode output without a stream encoding
    """
    s = u"string!"       #<====== replace to u"\xff"
    output.user = True
    sys.stdout.encoding = None
    puts(s, show_prefix=False)
    eq_(sys.stdout.getvalue(), s + "\n")

[تتبع الأثر]
خطأ UnicodeEncode: لا يمكن لبرنامج الترميز 'ascii' ترميز الأحرف في الموضع 0-4: الترتيب الترتيبي ليس في النطاق (128)

[تعليقات]
تم تحديد موقع نقطة عربات التي تجرها الدواب في الوظيفة "_encode" في utils.py ، لا يجب عليك ببساطة تحويل الرسالة إلى str باستخدام str (msg).

def _encode(msg, stream):
    if isinstance(msg, unicode) and hasattr(stream, 'encoding') and not stream.encoding is None:
        return msg.encode(stream.encoding)
    else:
        return str(msg)         #<========== buggy point
Bug Needs investigation Needs patch

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

هل من أحد يهتم؟

ال 5 كومينتر

هل من أحد يهتم؟

نعم ، يبدو أن تغيير return str(msg) إلى return msg يحل المشكلة دون كسر الاختبارات. لكن لماذا كان هذا التمثيل ضروريًا في المقام الأول؟

لست متأكدًا تمامًا من أنه من المنطقي تغيير هذا الآن. لن يؤدي ذلك إلى كسر رمز أي شخص تمامًا ، ولكنه يتيح لك في الأساس puts أشياء ليست سلاسل والحصول على شيء معقول:

>>> class Foo(object):
...   def __str__(self): return "The best Foo in the world"
...
>>> from fabric.api import puts
>>> puts(Foo())
The best Foo in the world

أعتقد أن هناك رمزًا يستخدم هذا (يائسًا في البحث عن هذا في جيثب ، لذلك لن أحاول البحث عن أمثلة).

لست متأكدًا من أنني أعتقد أنه من الصحيح أن عدم وجود مجموعة تشفير واستخدام unicode سيؤدي إلى تعطلنا puts .

اشتبه في أن الطريقة الأقل سوءًا لمعالجة هذا الآن هي ببساطة توسيع السطر المسيء إلى هذه الكتلة:

try:
    return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
    return msg # Best-effort fallback

وبهذه الطريقة ، مهما كانت الأسباب التي سبقت الطقوس التي كانت لدينا في عملية الصب إلى السلسلة ، فستستمر في العمل ، ولكن قضية عربات التي تجرها الدواب قيد المناقشة ستعود إلى "حسنًا ، لا أعرف ما هو هذا ، لكن لا يمكنني str() ذلك ، لذلك سأدفعه في الأنبوب كما هو ".

واجهت مشكلة مماثلة أثناء تشغيل طريقة sudo ، وحدث الاستثناء عند self.stream.write(text) في io.py . هل هناك أي تقدم بشأن قضايا يونيكود؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات
يستخدم موقع bleepcoder.com معلومات GitHub المرخصة بشكل عام لتزويد المطورين حول العالم بحلول لمشاكلهم. نحن لسنا تابعين لشركة GitHub، Inc. أو مع أي مطورين يستخدمون GitHub لمشاريعهم. نحن لا نستضيف أيًا من مقاطع الفيديو أو الصور على خوادمنا. جميع الحقوق تنتمي إلى أصحابها.
مصدر هذه الصفحة: مصدر

لغات البرمجة الشعبية
مشاريع GitHub الشعبية
المزيد من مشاريع GitHub

© 2024 bleepcoder.com - Contact
Made with in the Dominican Republic.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.