Bahasa Indonesia

Alat pengembang · URL encoder & decoder

URIError: URI format salah — mengapa decodeURIComponent muncul dan cara memperbaikinya

· Cara kerjanya

pengkodean url javascript penanganan kesalahan

Tanda persen diikuti dengan digit heksadesimal yang tidak valid menyebabkan pengecualian URIError
Ilustrasi vektor ToolAcre asli

decodeURIComponent muncul ketika tanda persen tidak diikuti oleh dua digit hex, atau ketika byte yang didekodekan tidak valid UTF-8. Posting ini menunjukkan masukan yang memicunya dan cara memecahkan kode secara defensif.

Tanda persen yang mogok — mengapa "100% off" merusak decodeURIComponent

Formulir mengumpulkan kode diskon "100% off". JavaScript meneruskan ini ke decodeURIComponent dalam decoder URL. Fungsi ini menampilkan URIError: URI format salah. Tanda persen tidak diikuti oleh dua angka heksadesimal. Ini sepenuhnya melanggar aturan pengkodean persen. decodeURIComponent mengharapkan setiap % memulai triplet seperti %20 atau %C3. Satu-satunya % adalah kesalahan sintaksis yang segera menghentikan eksekusi dan menimbulkan kesalahan.

Menangkap kesalahan ini dengan aman akan mencegah aplikasi mogok sepenuhnya. URL berasal dari input pengguna, pengalihan, kode QR, dan email. Kesalahan ketik sering terjadi. Laporan kerusakan dengan URIError memberi tahu Anda tempat untuk menyelidikinya dengan cepat. Penguraian kode defensif membuat aplikasi tetap berjalan dan log kesalahan berguna untuk proses debug.

Dua jenis kegagalan — bentuk pelolosan hex yang salah dan urutan byte UTF-8 yang tidak valid

decodeURIComponent muncul tepat dalam dua situasi. Pertama: urutan escape yang salah format. Persen tidak diikuti oleh dua digit hex (0-9, A-F, a-f). Contoh: %ZZ, %2, %2g. Kedua: triplet yang valid seperti %E9 mendekode menjadi UTF-8 byte yang tidak valid. Yang pertama adalah kesalahan format. Yang kedua adalah kesalahan semantik. Keduanya segera melempar dan menghentikan eksekusi.

UTF-8 memiliki aturan ketat tentang urutan byte. Byte 0x80–0xFF hanya muncul dalam urutan multi-byte. Satu %E9 tidak dapat valid hanya UTF-8 saja. Byte yatim piatu ini memicu kesalahan. Kesalahan format terlihat jelas. Kesalahan semantik tidak kentara namun sama nyatanya. Kedua kasus tersebut memerlukan penanganan try/catch dalam kode produksi.

Pengkodean byte tunggal lama — ketika %E9 saja yang muncul tetapi %C3%A9 bertahan

Kebingungan berasal dari sejarah standar web. Halaman lama menggunakan bahasa Latin-1 dan bukan UTF-8. Dalam bahasa Latin-1, %E9 diwakili é. Browser modern menggunakan UTF-8 secara eksklusif. UTF-8 mengkodekan é sebagai %C3%A9. Dekoder modern mengharapkan UTF-8 dan menolak %E9 karena formatnya salah. Ini adalah perilaku yang benar. Kesalahan ini menandakan adanya masalah dengan data sumber.

Konsensus modern: UTF-8 di mana pun. Standar URL menetapkan UTF-8. Semua browser saat ini menggunakan UTF-8. Jika Anda menemukan %E9 dari sistem lama, tangkap kesalahannya dan kembalikan ke string mentah. Jangan mendekode sebagai Latin-1 dalam kode modern. Selidiki dari mana data itu berasal.

Tiga masukan, tiga pesan kesalahan - perbedaan mesin pada string rusak yang sama

Mesin browser menolak masukan yang salah secara konsisten tetapi kesalahan kata berbeda. Chrome melaporkan "URI format salah". Firefox melaporkan "urutan URI salah". Safari melaporkan "tidak dapat mengonversi yang tidak ditentukan menjadi objek". Ketiga mesin menolak masukan yang identik. Kata-kata pesan yang tepat tidak distandarisasi di berbagai mesin atau versi. Jangan pernah mengandalkan teks kesalahan untuk memandu logika kode.

Jangan pernah mencocokkan pesan kesalahan untuk keputusan program. Selalu tangkap URIError berdasarkan jenisnya. Fungsi decodeUrl membungkus decodeURIComponent dan memberikan kode yang konsisten INVALID_PERCENT_ENCODING. Ini menyebutkan posisi masalah yang sebenarnya. Ini berfungsi sepanjang waktu proses karena tidak bergantung pada variasi kata-kata mesin. Pendekatan ini lebih dapat diandalkan dan dapat dipelihara.

Membaca pengecualian dengan aman — coba validasi/catch,, dan pola fallback

Pola pertahanan paling sederhana: bungkus decodeURIComponent dalam try/catch. Jika muncul, gunakan string mentah atau karakter pengganti. Hal ini mencegah input yang salah formatnya rusak. Untuk nilai kueri, tampilkan formulir berkode URL. Untuk teks yang dapat dilihat pengguna, sisipkan karakter pengganti. Hal ini mencegah masukan buruk merusak aplikasi dan menjaga stabilitas.

Pra-validasi dengan ekspresi reguler untuk kecepatan dan keamanan. Periksa apakah masukan hanya berisi kembar tiga %XX yang valid sebelum mendekode. Pola /%[0-9A-Fa-f]{2}/g menangkap pelolosan yang valid; apa pun yang tidak cocok tidak valid. Kesalahan format gagal dengan cepat pada sampah yang jelas terlihat. UTF-8 kesalahan masih perlu dicoba/catch. Secara bersamaan, hal ini memberikan perlindungan defensif yang komprehensif terhadap kesalahan.

Kegagalan diam-diam menyembunyikan bug — mengapa decoding buta sama berisikonya dengan pengkodean rusak

Risiko kecil: decoder tidak melempar tetapi secara diam-diam menghasilkan teks yang salah. Kode lama yang menggunakan unescape yang tidak digunakan lagi membuat UTF-8 tidak valid di memori. Teks terlihat baik-baik saja di layar hingga mencapai sistem yang memvalidasi UTF-8 secara ketat. Kode modern melempar alih-alih merusak secara diam-diam. Pengecualian lebih jelas dan lebih aman daripada korupsi data diam-diam yang menyebar ke hilir.

Asumsikan input pengguna salah format. Selalu bungkus panggilan. Catat kesalahan dengan masukan asli untuk debugging. Jangan pernah berasumsi setiap% valid. Kesalahan ketik dan pemotongan menghasilkan pelolosan yang tidak lengkap. Perlakukan sebagai kesalahan data, bukan kesalahan logika. Kode defensif bertahan dari masukan buruk dengan baik dan menjaga sistem tetap andal.

Apa yang dilewati oleh alat sebenarnya — perilaku kerangka sisi server dan pemulihan kesalahan

Kerangka kerja server menangani pengkodean yang salah dengan lebih lunak dibandingkan browser. Ruby, Python, dan PHP menawarkan konfigurasi untuk menangani pelolosan yang tidak valid di URL. Beberapa karakter pengganti pengganti secara otomatis. Yang lain menjatuhkan byte secara diam-diam. Beberapa memberikan pengecualian seperti yang dilakukan JavaScript. Perilaku sebenarnya bervariasi berdasarkan kerangka kerja dan pengaturan konfigurasi yang dipilih oleh pengembang.

Artikel ini hanya membahas perilaku JavaScript browser. Jika nilai datang dari API server, server sudah mendekode atau melewatkan kesalahan sebelum mengirim. Server bisa lebih pemaaf dibandingkan klien. Saat menulis kontrak API, tentukan apakah nilainya mentah atau sudah didekodekan sebelumnya. URL string kueri akan tiba dengan kode persen; JSON dapat tiba dalam kode yang sudah didekodekan.

Validasi lebih awal — menggunakan encoder & decoder URL untuk memeriksa string yang mencurigakan terlebih dahulu

Sebelum meneruskan URL yang mencurigakan ke decodeURIComponent, tempelkan ke encoder & decoder URL. Alat ini menunjukkan pengkodean yang tepat, menemukan pelolosan yang salah, dan menjelaskan kesalahan tanpa membuat aplikasi Anda mogok. Uji dengan %ZZ, %E9 dan 100% untuk melihat berbagai kegagalan dan pesan kesalahan sebenarnya. Ini membutuhkan waktu beberapa detik dan membangun kepercayaan diri.

Validasi lebih awal, tangkap kesalahan dengan baik dan catat apa yang rusak. Dekoder defensif ditambah alat pengujian membuat aplikasi tetap berjalan dan dapat di-debug. URL encoder & decoder mengubah "URI format salah" menjadi informasi yang dapat ditindaklanjuti dan dapat segera Anda gunakan. Terapkan pola ini ke dekoder Anda untuk ketahanan dan pemeliharaan di lingkungan produksi.