Вот мой обычный метод борьбы с этим. Во-первых, так как + является раздражающим особым случаем, я запрещаю его как часть кодирования. Если они ставят плюс, это плюс, если им нужен пробел, они могут нажать на эту большую полосу в нижней части клавиатуры. (И да, я сделал это как часть некоторых контрактов). Но на самом деле вы можете объяснить это, поскольку вы так усердно работаете для своего клиента, что им не нужно беспокоиться о его кодировании самостоятельно.
Затем я переписал java.net.URLDecoder.decode
, чтобы убрать «+». (На самом деле это просто вопрос вырезания и вставки в любой класс утилит, который я использую для этого проекта, и удаления ~ 4 строк).
Тогда для всего, что я получаю, я просто запускаю его через декодер, а затем кодировщик. Это будет декодировать и перекодировать его, если он закодирован, или закодировать, если он не закодирован. Я получил этот совет от кого-то несколько лет назад, не могу вспомнить, кому отдать должное.
Итак, я получаю:
String properlyencodedstring =
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8");
Единственный случай, когда для этого может потребоваться подстройка, это когда данные с большими группами URL-адресов необходимо вводить и обрабатывать, это то, что я переключаю свое предположение, использую input type="url"
(с некоторым типом javascript polyfill для старых браузеры) и препроцессировать с .replaceAll("+", " ")
, так как в этом случае не будет пробелов. (И, по всей вероятности, вместо этого используйте java.net.URI
)