Saya sangat bingung. Saya mencoba menyandikan tetapi kesalahannya mengatakan can't decode...
.
>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
Saya tahu bagaimana menghindari kesalahan dengan awalan "u" pada string. Saya hanya ingin tahu mengapa kesalahannya adalah "tidak dapat memecahkan kode" saat penyandian dipanggil. Apa yang dilakukan Python di bawah tenda?
python
python-2.7
unicode
python-2.x
python-unicode
thoslin.dll
sumber
sumber
"你好".decode('utf-8').encode('utf-8')
Selalu encode dari unicode ke byte.
Dalam arah ini, Anda dapat memilih pengkodean .
Cara lainnya adalah dengan memecahkan kode dari byte ke unicode.
Dalam arah ini, Anda harus tahu apa itu pengkodean .
Poin ini tidak bisa cukup ditekankan. Jika Anda ingin menghindari bermain unicode "whack-a-mole", penting untuk memahami apa yang terjadi di tingkat data. Di sini dijelaskan dengan cara lain:
decode
.encode
.Sekarang, saat melihat
.encode
pada string byte, Python 2 pertama kali mencoba mengubahnya secara implisit menjadi teks (unicode
objek). Demikian pula, saat melihat.decode
pada string unicode, Python 2 secara implisit mencoba mengubahnya menjadi byte (str
objek).Konversi implisit ini adalah mengapa Anda bisa mendapatkan saat Anda menelepon . Itu karena encoding biasanya menerima parameter tipe ; saat menerima parameter, ada dekode implisit ke dalam objek berjenis sebelum melakukan encoding ulang dengan encoding lain. Konversi ini memilih decoder 'ascii' default † , memberikan Anda kesalahan decoding di dalam encoder.
Unicode
Decode
Error
encode
unicode
str
unicode
Faktanya, dalam Python 3 metode
str.decode
danbytes.encode
bahkan tidak ada. Penghapusan mereka adalah upaya [kontroversial] untuk menghindari kebingungan umum ini.† ... atau kode apa pun yang
sys.getdefaultencoding()
disebutkan; biasanya ini adalah 'ascii'sumber
_
mengacu pada nilai sebelumnya 2. karena ini adalah pertanyaan python-2.x.Anda bisa mencobanya
Atau
Anda juga dapat mencoba mengikuti
Tambahkan baris berikut di atas file .py Anda.
sumber
Jika Anda menggunakan Python <3, Anda harus memberi tahu penerjemah bahwa literal string
u
Anda adalah Unicode dengan mengawali dengan :Bacaan lebih lanjut : Unicode HOWTO .
sumber
Anda gunakan
u"你好".encode('utf8')
untuk menyandikan string unicode. Tetapi jika Anda ingin mewakili"你好"
, Anda harus mendekodekannya. Seperti:Anda akan mendapatkan apa yang Anda inginkan. Mungkin Anda harus mempelajari lebih lanjut tentang encode & decode.
sumber
Jika Anda berurusan dengan Unicode, terkadang alih-alih
encode('utf-8')
, Anda juga dapat mencoba mengabaikan karakter khusus, misatau seperti yang
something.decode('unicode_escape').encode('ascii','ignore')
disarankan di sini .Tidak terlalu berguna dalam contoh ini, tetapi dapat bekerja lebih baik dalam skenario lain ketika beberapa karakter khusus tidak memungkinkan.
Atau Anda dapat mempertimbangkan untuk mengganti karakter tertentu menggunakan
replace()
.sumber
Jika Anda memulai penerjemah python dari shell di Linux atau sistem serupa (BSD, tidak yakin tentang Mac), Anda juga harus memeriksa pengkodean default untuk shell.
Panggil
locale charmap
dari shell (bukan interpreter python) dan Anda akan melihatnyaJika tidak demikian, dan Anda melihat sesuatu yang lain, mis
Python akan (setidaknya dalam beberapa kasus seperti dalam kasus saya) mewarisi pengkodean shell dan tidak akan dapat mencetak (beberapa? Semua?) Karakter unicode. Pengkodean default Python yang Anda lihat dan kontrol melalui
sys.getdefaultencoding()
dansys.setdefaultencoding()
dalam hal ini diabaikan.Jika ternyata Anda mengalami masalah ini, Anda dapat memperbaikinya dengan
(Atau sebagai alternatif, pilih peta kunci mana saja yang Anda inginkan daripada en_EN.) Anda juga dapat mengedit
/etc/locale.conf
(atau file mana pun yang mengatur definisi lokal di sistem Anda) untuk memperbaikinya.sumber