Alat pembangun · Pengekod & penyahkod Base64
Mengapa btoa() menggunakan emoji dan cara mengekod Base64 UTF-8 dalam JavaScript
· Bagaimana ia berfungsi
asas64 unicode pengekodan
btoa() sahaja menerima aksara sehingga U+00FF, jadi teks beraksen, CJK dan balingan emoji. Siaran ini menunjukkan apa yang sebenarnya diharapkan oleh fungsi dan cara TextEncoder memberi anda rentetan UTF-8 Base64 yang betul.
Mengapa btoa boleh membuang Unicode—dan menyalahkod loghat secara senyap
Memanggil btoa("😀") membuang InvalidCharacterError kerana emoji tidak boleh dimuatkan ke dalam unit kod bersaiz bait tunggal. Ralat yang lebih halus ialah btoa("é"): é prakarang ialah U+00E9, di bawah 256, jadi btoa menerimanya tetapi mengekod Latin-1 byte E9, bukan UTF-8 bait C3 A9. Loghat boleh dilihat sama yang ditulis sebagai e ditambah tanda gabungan boleh melontar kerana tanda itu berada di luar julat yang diterima. Kata pintas buku kerja "an accent throws" memerlukan kelayakan ini: rentetan boleh gagal dengan kuat atau secara senyap menghasilkan bait yang salah.
Apa yang btoa() benar-benar dikodkan: rentetan binari unit kod 0–255 — mengapa fungsi itu direka dalam bahasa Latin-1 bytes dan bukannya teks Unicode
btoa menggunakan "rentetan binari": setiap unit kod aksara JavaScript mestilah dalam julat 0–255 dan bermaksud satu bait. Ia tidak memahami pengekodan teks Unicode, bahasa atau normalisasi. Emoji astral diwakili oleh dua UTF-16 unit kod pengganti, kedua-duanya lebih besar daripada 255, jadi menghantar rentetan mentah JavaScript secara langsung tidak boleh berfungsi. Anggap output sebagai pengekodan bait, bukan aksara abstrak.
UTF-8 pertama, Base64 kedua — mengapa teks mesti menjadi bait sebelum sebarang abjad Base64 digunakan
TextEncoder menukar rentetan JavaScript menjadi urutan UTF-8 baitnya dahulu. Kemudian tukar setiap bait menjadi aksara rentetan binari dan hantar rentetan binari itu kepada btoa, atau gunakan API lain yang menerima bait secara langsung. Untuk penyahkodan, atob mengembalikan rentetan binari; pulihkan nilai baitnya dan berikannya kepada TextDecoder("utf-8"). ToolAcre menggunakan penyahkod ketat yang menolak UTF-8 yang cacat dan bukannya memasukkan aksara gantian secara senyap.
Contoh yang berfungsi: pengekodan 'café 😀' dengan TextEncoder dan btoa — urutan bait, rentetan binari perantaraan dan output akhir
Untuk kafe teks literal 😀, yang UTF-8 bait adalah 63 61 66 C3 A9 20 F0 9F 98 80 dalam perenambelasan: ASCII c-a-f, dua bait untuk é, ruang dan empat bait untuk emoji. Base64 daripada sepuluh bait ini ialah Y2Fmw6kg8J+YgA==. Pelapik dan abjad menerangkan bait sahaja; mereka tidak melabelkan bahasa tersebut. Bandingkan kegagalan btoa("kafe 😀") langsung dengan ToolAcre's UTF-8 mod, kemudian nyahkodkan keputusannya dan sahkan loghat yang boleh dilihat dan emoji yang sama bertahan.
Helah lama unescape(encodeURIComponent()) dan mengapa ia adalah penggodaman — apa yang dilakukan di bawah hud dan mengapa ia tidak digalakkan
Penyelesaian sejarah ialah btoa(unescape(encodeURIComponent(text))). encodeURIComponent percent-encodes UTF-8 dan unescape mengemas semula peratus triplet sebagai unit kod tunggal, tetapi unescape ditamatkan, sukar dibaca dan janggal di sekeliling pengganti tunggal yang cacat. Ia menjadikan penukaran kelihatan seperti URL pemprosesan walaupun tiada URL wujud. TextEncoder menyatakan sempadan yang dimaksudkan dengan jelas: teks menjadi bait sekali, dan Base64 sahaja beroperasi selepas itu.
Penyahkodan di sisi lain — memasangkan atob dengan TextDecoder supaya perjalanan pergi dan balik tidak rugi
Selepas atob, jangan panggil decodeURIComponent pada bait binari sewenang-wenangnya dan harap ia menjadi teks. Tukar kod aksara kepada Uint8Array dan hantarkannya melalui TextDecoder. Di kafe 😀 contoh hasilnya ialah jujukan UTF-8 asal sepuluh bait, kemudian rentetan asal. Jika Base64 menyahkod kepada imej atau bait fail termampat, ia mungkin tidak mewakili teks UTF-8 yang sah sama sekali; ToolAcre melaporkan bahawa daripada berpura-pura data binari adalah prosa yang boleh dibaca.
Perkara ini tidak meliputi — pengekodan fail dan gumpalan binari, varian base64url dan penstriman input besar
Penjelasan ini melibatkan teks yang dikodkan sebagai UTF-8. Fail dan Blob Base64, Base64url untuk segmen JWT dan pengekodan tambahan bagi data berbilang gigabait mempunyai antara muka atau keperluan memori yang berbeza. Base64 juga tidak menyulitkan token: sesiapa yang memegangnya boleh menyahkod bait. Penyahkod boleh menerima padding dan ruang kosong biasa yang hilang, tetapi kesalingoperasian masih bergantung pada mengetahui sama ada muatan adalah teks atau data binari sewenang-wenangnya.
Bawa pulang: mengekod bait, bukan rentetan dan semak perjalanan pergi dan balik — cara pengekod & penyahkod Base64 melakukan langkah UTF-8 untuk anda supaya aksen, CJK dan emoji bertahan
Kod bait, bukan rentetan JavaScript mentah, kemudian semak perjalanan pergi dan balik. Pengekod & penyahkod Base64 melaksanakan langkah TextEncoder dan TextDecoder untuk anda sambil menyimpan teks yang ditampal dalam pelayar. RFC 4648 menentukan abjad dan pelapik; UTF-8 membekalkan kontrak aksara-ke-bait yang berasingan. Mencampurkan kedua-dua lapisan itu ialah punca kedua-dua InvalidCharacterError dan Latin-1 rasuah yang tenang.