Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Menyahkod Rentetan dengan \'utf-8\' Menghasilkan \'UnicodeDecodeError: invalid continuation byte\' Semasa \'latin-1\' Berjaya?
Soalan:
Menyahkod rentetan menggunakan codec 'utf-8' menghasilkan pengecualian 'UnicodeDecodeError: invalid continuation byte', tetapi berjaya dengan codec 'latin-1'. Mengapa ini berlaku?
Kod:
o = "a test of \xe9 char" v = o.decode("utf-8")
Penyelesaian:
UTF-8 lwn. Pengekodan Latin-1
Pengekodan UTF-8 menggunakan berbilang bait untuk mewakili aksara, manakala Latin-1 ialah pengekodan bait tunggal. Dalam Latin-1, bait 0xe9 mewakili aksara é.
Bait Sambungan Tidak Sah
Dalam UTF-8, bait 0xe9 ialah bait sambungan yang digunakan untuk menunjukkan bahawa bait sebelumnya adalah sebahagian daripada aksara berbilang bait. Walau bagaimanapun, dalam rentetan kami, bait 0xe9 muncul sebagai bait terpencil, yang tidak dibenarkan dalam UTF-8.
Menggunakan Latin-1
Kerana Latin-1 mentafsir 0xe9 sebagai aksara dan bukannya bait kesinambungan, penyahkodan berjaya dengan codec 'latin-1'. Walau bagaimanapun, pendekatan ini tidak sesuai, kerana ia mungkin membawa kepada ralat jika pengekodan yang dijangkakan sebenarnya UTF-8.
Konteks Tambahan
Ralat ini boleh berlaku apabila membaca data daripada sumber yang tidak menyatakan pengekodan secara eksplisit atau apabila bekerja dengan sistem warisan yang menggunakan pengekodan Latin-1 data.
Penyelesaian:
Untuk menyelesaikan isu, pastikan pengekodan yang betul digunakan untuk penyahkodan dan pengekodan data. Untuk fail dengan pengekodan UTF-8 yang diketahui atau dijangka, gunakan UTF-8 apabila membuka fail dan menyahkod teks. Untuk data yang diterima daripada sumber yang tidak dipercayai atau sistem dengan pengekodan yang tidak diketahui, pertimbangkan untuk menggunakan codec universal seperti 'utf-8-sig' atau 'chardet' untuk mengesan pengekodan yang betul secara automatik.
Atas ialah kandungan terperinci Mengapa Menyahkod Rentetan dengan \'utf-8\' Menghasilkan \'UnicodeDecodeError: invalid continuation byte\' Semasa \'latin-1\' Berjaya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!