Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Menyahkod Rentetan dengan \'utf-8\' Menghasilkan \'UnicodeDecodeError: invalid continuation byte\' Semasa \'latin-1\' Berjaya?

Mengapa Menyahkod Rentetan dengan \'utf-8\' Menghasilkan \'UnicodeDecodeError: invalid continuation byte\' Semasa \'latin-1\' Berjaya?

Susan Sarandon
Susan Sarandonasal
2024-11-25 07:27:11238semak imbas

Why Does Decoding a String with 'utf-8' Result in a

Ralat Pengekodan Unikod: Bait Penerusan Tidak Sah

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn