Phân tích chuỗi truy vấn phức tạp hơn một chút so với vẻ ngoài của nó, tùy thuộc vào mức độ bạn muốn tha thứ.
Đầu tiên, chuỗi truy vấn là byte ascii. Bạn đọc từng byte một và chuyển đổi chúng thành các ký tự. Nếu là nhân vật? hoặc & sau đó nó báo hiệu bắt đầu một tên tham số. Nếu ký tự là = thì nó báo hiệu bắt đầu một giá trị tham số. Nếu ký tự là% thì nó báo hiệu bắt đầu một byte được mã hóa. Đây là nơi nó trở nên khó khăn.
Khi bạn đọc bằng% char, bạn phải đọc hai byte tiếp theo và hiểu chúng là các chữ số hex. Điều đó có nghĩa là hai byte tiếp theo sẽ là 0-9, af hoặc AF. Dán hai chữ số hex này lại với nhau để lấy giá trị byte của bạn. Nhưng hãy nhớ rằng, byte không phải là ký tự . Bạn phải biết mã hóa nào đã được sử dụng để mã hóa các ký tự. Ký tự é không mã hóa giống nhau trong UTF-8 như trong ISO-8859-1. Nói chung, không thể biết mã hóa nào được sử dụng cho một bộ ký tự nhất định. Tôi luôn sử dụng UTF-8 vì trang web của tôi được định cấu hình để luôn phục vụ mọi thứ bằng UTF-8 nhưng trong thực tế, bạn không thể chắc chắn. Một số tác nhân người dùng sẽ cho bạn biết mã hóa ký tự trong yêu cầu; bạn có thể thử đọc nó nếu bạn có một yêu cầu HTTP đầy đủ. Nếu bạn chỉ có một url trong sự cô lập, chúc may mắn.
Dù sao, giả sử bạn đang sử dụng UTF-8 hoặc một số mã hóa ký tự nhiều byte khác, bây giờ bạn đã giải mã được một byte được mã hóa, bạn phải đặt nó sang một bên cho đến khi bạn bắt được byte tiếp theo. Bạn cần tất cả các byte được mã hóa cùng nhau vì bạn không thể giải mã url đúng một byte mỗi lần. Đặt tất cả các byte cùng nhau sau đó giải mã tất cả chúng cùng một lúc để tái cấu trúc nhân vật của bạn.
Thêm vào đó, nó sẽ trở nên thú vị hơn nếu bạn muốn được khoan dung và giải thích cho các tác nhân người dùng sử dụng url. Ví dụ, một số khách hàng webmail mã hóa hai thứ. Hoặc nhân đôi ký tự? & = (Ví dụ http://yoursite.com/blah??p1==v1&&p2==v2
:). Nếu bạn muốn cố gắng xử lý một cách duyên dáng với điều này, bạn sẽ cần thêm logic hơn vào trình phân tích cú pháp của mình.
getQuery()
và những gì bạn muốn nhận làm đầu ra?