包含中文字符的无效URI(Java)

时间:2011-01-28 17:37:28

标签: java url uri multibyte utf

在网址中设置包含中文字符的网址连接时遇到问题。它适用于拉丁字符:

String xstr = "维也纳恩斯特哈佩尔球场" ;
URI uri = new URI("http","ajax.googleapis.com","/ajax/services/language/detect","v=1.0&q="+xstr,null);   
URL url = uri.toURL(); 
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream() ;

getInputStream()调用导致:

java.lang.IllegalArgumentException: Invalid uri 'http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=???????????': Invalid query

4 个答案:

答案 0 :(得分:7)

问题是由URI.toURL()未对非ASCII字符进行百分比编码这一事实引起的。请改用以下内容:

URL url = new URL(uri.toASCIIString());  

答案 1 :(得分:2)

axtavt上面的回答让我免于精神错乱,谢谢!只有一条评论(我无法弄清楚如何在答案下方发表评论)。

如果您从URL开始,则需要在构建URI之前对引号进行编码:

String s = "your_url?with=\"quotes\"";
URI su = new URI (s.replaceAll("\"", "%22");
URL ur = new URL( su.toASCIIString());

答案 2 :(得分:0)

我认为它与“UTF-8”字符集有关。请查看此topic以了解详情以及此chinese in java

答案 3 :(得分:0)

根据URI RFC(参见第2.4节),非US-ASCII字符在URI中无效。你必须编码它们。