java.net.URI душит специальные символы в принимающей части - PullRequest
4 голосов
/ 27 сентября 2010

У меня есть строка URI, подобная следующей:

http://www.christlichepartei%F6sterreichs.at/steiermark/

Я создаю экземпляр java.lang.URI с этой строкой, и он успешно выполняетсяно когда я хочу получить хост, он возвращает ноль.Opera и Firefox также подавляют этот URL, если я ввожу его точно так, как показано выше.Но не должен ли класс URI выдавать исключение URISyntaxException, если оно недопустимо?Как я могу обнаружить, что URI тогда недопустим?

Он также ведет себя так же, когда я декодирую строку, используя URLDecoder, который выдает

http://www.christlicheparteiösterreichs.at/steiermark/

Теперь это принято Opera и Firefox, но java.net.URI все еще не нравится.Как я могу справиться с таким URL?

спасибо

Ответы [ 3 ]

4 голосов
/ 27 сентября 2010

Java 6 имеет класс IDN для работы с интернационализированными доменными именами.Итак, следующий код производит URI с закодированным именем хоста:

URI u = new URI("http://" + IDN.toASCII("www.christlicheparteiösterreichs.at") + "/steiermark/");
2 голосов
/ 27 сентября 2010

URI выдает URISyntaxException , когда вы выбираете соответствующий конструктор:

URI someUri=new URI("http","www.christlicheparteiösterreichs.at","/steiermark",null);

java.net.URISyntaxException: недопустимый символ в имени хоста с индексом 28: http://www.christlicheparteiösterreichs.at/steiermark

Вы можете использовать IDN , чтобы исправить это:

URI someUri=new URI("http",IDN.toASCII("www.christlicheparteiösterreichs.at"),"/steiermark",null);
System.out.println(someUri);
System.out.println("host: "+someUri.getHost()));

Выход:

http://www.xn - christlicheparteisterreichs-5yc.at/steiermark

хост: www.xn--christlicheparteisterreichs-5yc.at

ОБНОВЛЕНИЕ относительно проблемы куриного яйца:

Вы можете позволить URL делать работу:

public static URI createSafeURI(final URL someURL) throws URISyntaxException
{
return new URI(someURL.getProtocol(),someURL.getUserInfo(),IDN.toASCII(someURL.getHost()),someURL.getPort(),someURL.getPath(),someURL.getQuery(),someURL.getRef());    
}


URI raoul=createSafeURI(new URL("http://www.christlicheparteiösterreichs.at/steiermark/readme.html#important"));

Это всего лишь быстрый способ, он не проверяет все вопросы, касающиеся преобразования URL-адреса в URI. Используйте это как отправную точку.

2 голосов
/ 27 сентября 2010

Правильный способ кодирования не-ASCII символов в именах хостов известен как "Punycode" .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...