Fabric: UnicodeEncodeError saat memanggil fungsi put dengan unicode u '\ xff' dan stream.encoding adalah None

Dibuat pada 8 Apr 2015  ·  5Komentar  ·  Sumber: fabric/fabric

Hai,
Saat mengganti variabel s ke nilai lain u '\ xff' , pengujian ini akan gagal.

[Kasus cobaan]

@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")

[melacak kembali]
UnicodeEncodeError: 'ascii' codec tidak dapat menyandikan karakter di posisi 0-4: ordinal tidak dalam kisaran (128)

[komentar]
Titik buggy terletak di fungsi '_encode' di utils.py, Anda tidak boleh hanya mentransmisikan msg ke str dengan menggunakan 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

Komentar yang paling membantu

Ada yang peduli?

Semua 5 komentar

Ada yang peduli?

Ya, tampaknya mengubah return str(msg) menjadi return msg menyelesaikan masalah tanpa merusak tes. Tetapi mengapa pemeran ini diperlukan sejak awal?

Saya tidak sepenuhnya yakin masuk akal untuk mengubah ini sekarang. Ini tidak akan benar-benar merusak kode siapa pun, tetapi pada dasarnya memungkinkan Anda puts hal-hal yang bukan string dan mengeluarkan sesuatu yang masuk akal:

>>> 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

Saya menduga ada kode di luar sana yang menggunakan ini (putus asa untuk mencari ini di github, jadi tidak akan mencoba mencari contoh).

Saya tidak yakin saya pikir itu benar bahwa tidak memiliki set pengkodean dan menggunakan unicode akan menyebabkan puts membuat kita crash.

Curigai cara paling buruk untuk mengatasi hal ini untuk saat ini adalah dengan memperluas baris yang melanggar ke dalam blok ini:

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

Dengan cara ini, apa pun alasan kuno yang kami miliki untuk melakukan casting-to-string akan terus berfungsi, tetapi kasus buggy yang sedang dibahas akan kembali ke "yah, saya tidak tahu apa ini, tetapi saya tidak bisa str() itu , jadi saya hanya akan mendorongnya ke pipa apa adanya ".

Saya mengalami masalah serupa saat menjalankan metode sudo , dan pengecualian terjadi pada self.stream.write(text) dalam io.py . Apakah ada kemajuan dalam masalah unicode?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat
bleepcoder.com menggunakan informasi GitHub berlisensi publik untuk menyediakan solusi bagi pengembang di seluruh dunia untuk masalah mereka. Kami tidak berafiliasi dengan GitHub, Inc. atau dengan pengembang mana pun yang menggunakan GitHub untuk proyek mereka. Kami tidak meng-host video atau gambar apa pun di server kami. Semua hak milik masing-masing pemiliknya.
Sumber untuk halaman ini: Sumber

Bahasa pemrograman populer
Proyek GitHub populer
Lebih banyak proyek 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.