Alat pembangun · Pengekod & penyahkod Base64
Menyahkod Base64 kepada UTF-8 tanpa mojibake: atob plus TextDecoder
· Bagaimana ia berfungsi
asas64 pengekodan unicode
atob() mengembalikan bait yang menyamar sebagai aksara, itulah sebabnya teks beraksen kelihatan rosak selepas penyahkodan. Siaran ini menunjukkan saluran paip yang betul dari Base64 hingga bait kepada teks UTF-8 dan cara mengenali corak kegagalan.
Respons API yang menyahkod kepada 'Café' — simptom mojibake konkrit dan dua bait di belakang dua aksara yang salah
Rentetan Base64 Q2Fmw6k= menyahkod kepada bait (67, 97, 102, 195, 169), iaitu UTF-8 teks Kafe. Tampalkan ke dalam penyahkod naif (sahaja penukaran atob dan rentetan) dan output selalunya Café, setiap aksen digantikan dengan dua aksara yang salah. Mojibake ini berlaku kerana atob mengembalikan rentetan bait (unit kod 0–255), bukan teks UTF-8. Bait 195 dan 169 mengekod beraksen é dalam UTF-8.
Melayan mereka seolah-olah aksara Latin-1 yang berasingan memberikan corak mojibake. Saluran paip yang betul ialah atob (bait sebagai rentetan), kemudian TextDecoder (mentafsirkan bait sebagai UTF-8), dan teks asal kembali. Fungsi atob tidak rosak; ia direka untuk data binari. Namanya berasal daripada ASCII-ke-binari, dan rentetan binari yang dihasilkannya ialah jujukan unit kod 0–255, setiap satu mewakili satu bait.
Apa yang atob() sebenarnya kembalikan — rentetan unit kod 0–255 yang bermaksud bait, bukan teks yang dinyahkod
Jika anda menyuapnya Q2Fmw6k= (standard Base64), ia mengeluarkan rentetan di mana setiap aksara ialah satu bait: unit kod 67, kemudian 97, kemudian 102, kemudian 195, kemudian 169. Jika memaparkan rentetan itu secara langsung atau mentafsirkan sebagai teks Latin-1, anda melihat output yang tidak betul. Langkah yang tiada ialah menukar unit kod kepada tatasusunan bait dan kemudian menyahkod tatasusunan sebagai UTF-8.
Gelung charCodeAt memulihkan nilai bait: untuk setiap aksara dalam output atob, panggil charCodeAt untuk mendapatkan unit kod (nombor 0–255), simpan dalam Uint8Array. Selepas tatasusunan bait wujud, hantar ke TextDecoder dengan charset utf-8. TextDecoder membaca jujukan bait dan mentafsir sebagai teks UTF-8, menggabungkan jujukan bait seperti (195, 169) kepada aksara tunggal seperti é. Bait (67, 97, 102, 195, 169) menjadi Kafe rentetan empat aksara. Gelung itu sengaja membosankan: baca setiap unit kod yang dikembalikan dengan charCodeAt dan tetapkan ia pada kedudukan Uint8Array yang sepadan. Tiada keputusan set aksara berlaku di sana. Satu-satunya tafsiran tiba apabila TextDecoder menerima tatasusunan itu dan menggunakan UTF-8 dengan pengendalian ralat yang membawa maut.
Mengubah rentetan itu menjadi Uint8Array — gelung charCodeAt dan sebab ia adalah salinan bait, bukan penukaran
Proses dua langkah ini—pemulihan bait, kemudian tafsiran UTF-8—ialah yang dilakukan oleh pengekod & penyahkod Base64 secara dalaman. Corak mojibake adalah petanda ralat ini. Jika Café muncul sebagai Café, anda melihat Latin-1 tafsiran UTF-8 bait. UTF-8 bait untuk é ialah 0xC3 0xA9 (perpuluhan 195, 169). Dalam bahasa Latin-1, unit kod 195 ialah à dan unit kod 169 ialah ©.
Apabila UTF-8 jujukan bait dibaca seolah-olah setiap bait adalah aksara Latin-1 yang berasingan, setiap jujukan UTF-8 berbilang bait menghasilkan aksara gantian yang salah. Jika Café muncul sebagai Caf diikuti dengan watak pengganti, atau sebagai Caf? atau Caf tambah U+FFFD, anda melihat kegagalan yang berbeza: penyahkod tidak mengenali jujukan bait sebagai sah UTF-8. Contoh konkrit: Base64 SGVsbG8sIOS4lueVjCEg8J-Zgg== menyahkod seperti berikut.
TextDecoder dan keputusan charset — menyahkod sebagai UTF-8, dan mengapa set charset adalah fakta berasingan yang anda mesti tahu
atob menghasilkan rentetan binari dengan bait (72, 101, 108, 108, 111, 44, 32, 228, 184, 180, 149, 140, 33, 32, 240, 159, 152, 130). Enam bait pertama ialah ASCII: menjadi Hello,. Bait 228, 184, 180 ialah tiga bait UTF-8 urutan mewakili CJK watak. Bait 149, 140 adalah sebahagian daripada urutan seterusnya. Urutan lengkap termasuk urutan emoji empat bait (240, 159, 152, 130) untuk watak akhir.
Apabila diproses dengan betul melalui TextDecoder, semua bait bergabung untuk menghasilkan teks skrip campuran asal. UTF-8 jujukan bait mempunyai panjang yang boleh diramal: bait yang bermula dengan 0xxxxxxx ialah bait tunggal ASCII; bait bermula dengan 110xxxxx menjangkakan bait berikut bermula dengan 10xxxxxx (jumlah dua bait); bait bermula dengan 1110xxxx menjangkakan dua bait berikut (jumlah tiga bait); bait bermula dengan 11110xxx menjangkakan tiga bait berikut (jumlah empat bait). Untuk sampel campuran CJK-dan-emoji, paparan bait adalah diagnostik terutamanya kerana ASCII gerak hati tidak lagi membantu. Beberapa bait tergolong dalam setiap simbol yang boleh dilihat, dan pemadaman satu bait mengalihkan urutan yang tinggal kepada UTF-8 yang tidak sah. Penyahkodan yang ketat mengubah perubahan itu kepada kegagalan yang dinamakan dan bukannya kerosakan yang kelihatan munasabah.
Contoh berfungsi: menyahkod rentetan Base64 yang mengandungi CJK dan emoji — bait, titik kod dan rentetan akhir berbanding dengan yang asal
Urutan bermula dengan 1111110x tidak sah dalam UTF-8 (terpelihara untuk masa hadapan, tidak digunakan). Bait yang bermula dengan 10xxxxxx tidak boleh muncul sebagai bait petunjuk; ia adalah kesinambungan. Jika strim bait melanggar peraturan, ia tidak sah UTF-8. TextDecoder dengan charset utf-8 mentafsir tatasusunan mengikut peraturan ini dan berjaya untuk jujukan yang sah. Untuk tidak sah, ia melaporkan ralat.
Pengekod & penyahkod Base64 menggunakan TextDecoder dengan bendera mod ketat benar. Ini bermakna UTF-8 yang tidak sah menimbulkan ralat dan bukannya memasukkan aksara gantian secara senyap (U+FFFD). Jika rentetan Base64 menyahkod kepada bait yang tidak sah UTF-8, mod ketat akan membuang dan bukannya meneruskan dengan teks bercelaru. Ini adalah pilihan reka bentuk: muatan binari (imej, kunci, data termampat) bukan teks dan tidak boleh dinyahkodkan sebagai teks.
Mengenali corak: Ã, †dan � — bagaimana untuk memberitahu masalah Base64 daripada masalah charset
Jika cuba menyahkod JPEG sebagai Base64, strim bait tidak akan mewakili UTF-8 yang sah dan penyahkodan yang ketat akan menolaknya. Alat menawarkan paparan hex untuk muatan sedemikian: anda boleh melihat bait mentah tanpa berpura-pura ia adalah teks. Mengenal pasti ralat penyahkod UTF-8 melibatkan melihat bait dalam konteks. Adakah nombor ganjil yang dijangkakan urutan berbilang bait?
Adakah bait pertama jujukan berpotensi tidak sah (bermula dengan 10xxxxxx)? Adakah bait kesinambungan tiada? Butang byte-output menyediakan garpu paling bersih dalam penyiasatan. Jika hex muncul tetapi penyahkodan teks gagal, penghuraian Base64 berjaya dan muatan adalah sama ada binari, rosak atau dikodkan dengan set aksara yang berbeza. Menukar tanda baca Base64 tidak boleh membaiki ketidakpadanan charset selepas bait yang betul telah muncul.
Perkara ini tidak meliputi — UTF-16 muatan, output binari seperti imej dan pengendalian bait tidak sah
Corak adalah konsisten. Satu bait 0xFF tidak sah dalam UTF-8; ia tidak boleh ASCII bait (sahaja 0–127 adalah ASCII) dan tidak boleh menjadi bait petunjuk (bait petunjuk ialah 0xC0–0xFD, 0xFF dikhaskan). Pengganti tunggal (UTF-16 konsep) tidak boleh muncul dalam UTF-8; jika melihat jujukan bait 0xED 0xA0 0x80 (yang mengekod pengganti U+D800 dalam gaya UTF-8), ia tidak sah UTF-8.
Satu penyelesaian sejarah ialah btoa(unescape(encodeURIComponent(text))). encodeURIComponent menukar kafe menjadi %C3%A9 (pengekodan peratus UTF-8 bait), unescape pek semula sebagai unit kod, btoa mengekod unit kod. Ini berfungsi untuk kebanyakan teks tetapi rapuh di sekitar pengganti tunggal dan sukar dibaca. Saluran paip moden—TextEncoder kepada bait, kemudian base64—lebih jelas dan standard. TextEncoder terbina dalam semua pelayar moden dan Node.js, membuat pilihan yang tepat. UTF-16, pengekodan bait tunggal warisan dan kandungan fail sewenang-wenangnya memerlukan penyahkod yang dipilih untuk bait tersebut atau pemapar sedar binari. ToolAcre sengaja tidak meneka di kalangan mereka. Meneka boleh menukar urutan yang tidak sah menjadi teks yang mengelirukan, manakala lambakan hex mengekalkan setiap bait untuk tafsiran termaklum kemudian.
Bawa pulang: Base64 memberi anda bait, UTF-8 memberi anda teks — cara pengekod & penyahkod Base64 melakukan kedua-dua langkah supaya teks yang dinyahkod sepadan dengan input dengan tepat
Apabila anda mempunyai rentetan Base64 dan mahu teks UTF-8, langkah lengkap ialah: menyahkod Base64 kepada bait (menggunakan pustaka penyahkodan atob atau base64), buat Uint8Array daripada bait, hantar tatasusunan kepada TextDecoder dengan charset utf-8, baca hasil sebagai rentetan.
Jika input adalah data binari dan bukannya teks, langkau TextDecoder dan periksa bait secara langsung. Pengekod & penyahkod Base64 menyediakan paparan bait heksadesimal, mengekalkan nilai yang UTF-8 penyahkodan yang ketat akan ditolak. Garpu itu adalah diagnostik: bait yang berjaya ditambah teks yang gagal bermakna penghuraian Base64 berfungsi, manakala muatan adalah binari, rosak atau dikodkan dengan set charset alat ini tidak meneka.