UnicodeDecodeError: Codec 'ascii' Tidak Dapat Menyahkod Bait
Masalahnya
Apabila cuba menukar rentetan Python 2.x yang mengandungi bukan- aksara ASCII kepada rentetan Unicode, anda mungkin menemui "UnicodeDecodeError: codec 'ascii' tidak boleh ralat decode byte". Ini berlaku kerana tingkah laku lalai adalah untuk menganggap pengekodan ASCII, yang tidak boleh mengendalikan aksara bukan ASCII.
Pembetulan Pantas
- Pastikan anda menyahkod rentetan kepada rentetan Unikod secara eksplisit.
- Jangan anggap rentetan ialah UTF-8 dikodkan.
- Tukar rentetan kepada rentetan Unikod seawal mungkin dalam kod.
- Pertimbangkan untuk membetulkan tempat anda untuk pengendalian Unikod yang lebih baik.
- Elakkan penggodam muat semula pantas.
Memahami Unicode dalam Python 2.x
Rentetan Unicode tidak mempunyai pengekodan dan memegang kod titik Unikod, manakala rentetan mengandungi teks yang dikodkan (cth., UTF-8, UTF-16). Penggunaan modul Markdown bagi unicode() sebagai get kualiti memastikan rentetan masuk ialah rentetan Unicode.
Gotchas dan Contoh
- Penukaran eksplisit tanpa pengekodan: unicode('€')
- Rentetan format gaya baharu ke dalam rentetan Unikod: u"Mata wangnya ialah: {}".format('€')
- Rentetan format gaya lama ke dalam rentetan Unikod: u'Mata wang ialah: %s' % '€'
- Tambah rentetan pada Unikod: u' Mata wangnya ialah: ' '€'
Sandwic Unicode
Tubuhkan "Sandwic Unicode" dalam kod anda: menyahkod data input kepada Unicode, berfungsi dengan rentetan Unicode dan mengekod kepada rentetan pada output. Ini mengelakkan kebimbangan pengekodan di tengah-tengah kod.
Input dan Penyahkodan
- Tentukan rentetan Unicode dalam kod sumber dengan awalan 'u' (cth., u'Zürich').
- Tetapkan pengepala pengekodan yang betul untuk kod sumber yang mengandungi aksara bukan ASCII (cth., # pengekodan: utf-8).
- Gunakan io.open dengan pengekodan yang sesuai untuk input fail teks.
- Gunakan backports.csv untuk mengendalikan fail CSV bukan ASCII.
- Konfigurasikan pangkalan data untuk mengembalikan data Unicode.
- Nyahkod kandungan HTTP secara manual berdasarkan pengepala jenis Kandungan charset.
Output
- print() cuba untuk mengekod Unicode kepada pengekodan konsol.
- pengekodan stdout boleh dipaksa dengan pembolehubah persekitaran PYTHONIOENCODING.
- Gunakan io.open untuk mengekod Unikod kepada bait rentetan untuk output fail.
Perbezaan Python 3
- Str Python 3 ialah rentetan Unikod.
- Pengekodan lalai ialah UTF-8.
- open() beroperasi dalam mod teks secara lalai, mengembalikan str yang dinyahkod (Unicode).
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat 'UnicodeDecodeError: 'ascii' codec can't decode byte' dalam Python 2.x dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!