Mem-parsing string kueri sedikit lebih rumit daripada yang terlihat, tergantung pada bagaimana Anda memaafkan.
Pertama, string kueri adalah ascii byte. Anda membaca dalam byte ini satu per satu dan mengubahnya menjadi karakter. Jika karakternya adalah? atau & kemudian menandakan dimulainya nama parameter. Jika karakter adalah = maka itu menandakan dimulainya nilai paramter. Jika karakternya% maka itu menandakan dimulainya byte yang dikodekan. Di sinilah rumit.
Ketika Anda membaca di% char, Anda harus membaca dua byte berikutnya dan menafsirkannya sebagai digit hex. Itu berarti dua byte berikutnya adalah 0-9, af atau AF. Rekatkan kedua digit hex ini untuk mendapatkan nilai byte Anda. Tapi ingat, byte bukan karakter . Anda harus tahu pengkodean apa yang digunakan untuk mengkodekan karakter. Karakter é tidak mengkodekan yang sama dalam UTF-8 seperti pada ISO-8859-1. Secara umum tidak mungkin untuk mengetahui pengkodean apa yang digunakan untuk set karakter yang diberikan. Saya selalu menggunakan UTF-8 karena situs web saya dikonfigurasi untuk selalu melayani semuanya menggunakan UTF-8 tetapi dalam praktiknya Anda tidak bisa memastikan. Beberapa agen-pengguna akan memberi tahu Anda karakter penyandian dalam permintaan; Anda dapat mencoba membacanya jika Anda memiliki permintaan HTTP penuh. Jika Anda hanya memiliki url dalam isolasi, semoga berhasil.
Lagi pula, dengan asumsi Anda menggunakan UTF-8 atau pengkodean karakter multi-byte lainnya, sekarang setelah Anda mendekodekan satu byte yang dikodekan, Anda harus mengesampingkannya sampai Anda menangkap byte berikutnya. Anda memerlukan semua byte yang disandikan yang digabungkan karena Anda tidak dapat url-decode dengan benar satu byte pada suatu waktu. Sisihkan semua byte yang bersama-sama lalu dekode semuanya sekaligus untuk merekonstruksi karakter Anda.
Plus itu akan lebih menyenangkan jika Anda ingin bersikap lunak dan memperhitungkan agen pengguna yang membuat url. Sebagai contoh, beberapa klien webmail mengkodekan hal-hal. Atau gandakan? & = Karakter (misalnya:) http://yoursite.com/blah??p1==v1&&p2==v2
. Jika Anda ingin mencoba menangani hal ini dengan anggun, Anda perlu menambahkan lebih banyak logika ke parser Anda.
getQuery()
, dan apa yang ingin Anda dapatkan sebagai output?