Selon le W3C (et ils sont la source officielle sur ces choses), un caractère d'espace dans la chaîne de requête (et dans la chaîne de requête seulement) peut être encodé soit comme " %20
" ou " +
". De la section "Chaînes de requête" sous "Recommandations" :
Dans la chaîne de requête, le signe plus est réservé à la notation abrégée d'un espace. Par conséquent, les vrais signes plus doivent être encodés. Cette méthode a été utilisée pour faciliter le passage des URI de requête dans les systèmes qui n'autorisent pas les espaces.
Selon la section 3.4 du RFC2396 qui est la spécification officielle sur les URI en général, le composant "query" est dépendant de l'URL :
3.4. Composant de la requête Le composant de la requête est une chaîne d'informations qui doit être interprétée par la ressource.
query = *uric
Dans un composant de requête, les caractères " ;", "/", " ?", " :", "@", "&", "=", "+", ",", et "$" sont réservés.
Il s'agit donc d'un bogue dans l'autre logiciel s'il n'accepte pas les URL avec des espaces dans la chaîne de requête encodée en " +
" personnages.
Pour ce qui est de la troisième partie de votre question, il existe un moyen (bien qu'un peu laid) de corriger la sortie de l'application URLEncoder.encode()
est alors de appelez replaceAll("\\+","%20")
sur la valeur de retour.