Есть ли в Википедии какой-то странный способ кодировать юникод в URL?
Это не совсем странно, это стандартное использование IRI с. ИРИ:
http://en.wikipedia.org/wiki/2009–10_UE_Lleida_season
, который включает Unicode en-dash, эквивалентен URI:
http://en.wikipedia.org/wiki/2009%E2%80%9310_UE_Lleida_season
Вы можете включить в ссылки форму IRI, и она будет работать в современных браузерах. Но многим сетевым библиотекам, включая Java и более старые браузеры, требуются URI только для ASCII. (Современные браузеры по-прежнему будут показывать симпатичную версию IRI в адресной строке, даже если вы связались с ней с помощью закодированной версии URI.)
Чтобы преобразовать IRI в URI в целом, вы используете алгоритм IDN для имени хоста и кодируете URL-адреса любых других не ASCII-символов в виде байтов UTF-8. В вашем случае это должно быть:
String urlencoded= URLEncoder.encode(x, "utf-8").replace("+", "%20");
URL url= new URL("http://en.wikipedia.org/wiki/"+urlencoded);
Примечание: замена +
на %20
необходима для получения значений x
с пробелами в работе. URLEncoder
делает application/x-www-form-urlencoded
-кодирование как использование в строках запроса. Но в таком сегменте пути-URL правило +
-means-space не применяется. Пробелы в путях должны быть закодированы с помощью обычного URL-кодирования до %20
.
Опять же ... в конкретном случае Википедии, для удобства чтения, они заменяют пробелы подчеркиванием вместо этого, так что вам, вероятно, лучше заменить "+"
на "_"
напрямую. Версия %20
все еще будет работать, потому что они перенаправляют оттуда к версии с подчеркиванием.