- Values are percent-decoded
- Each value is decoded, so %20 becomes a space and %C3%A9 becomes é. A + is treated as a space, which is correct for query strings because that is how HTML form submissions encode them.
- Repeated keys become arrays
- A query string may repeat a key, tag=a&tag=b is how HTML forms submit multiple checkbox values. Those are grouped into an array rather than having one silently overwrite the other, which matches how server frameworks parse them.
- Bracket notation is not expanded
- Some frameworks encode structure as user[name]=Ada. That is a convention rather than part of the URL standard, so the key is reported literally as "user[name]" instead of being guessed into a nested object. Different frameworks parse that syntax differently, so inventing a structure would be misleading.
- Valueless and empty parameters
- A bare flag such as ?debug gets an empty string, as does ?debug=. The URL standard does not distinguish the two, so neither does this, if that distinction matters in your application, it is a convention your code imposes rather than something the URL records.