如何处理UNICODE URL?

时间:2012-09-09 01:44:33

标签: java url unicode

如果我想在Java中使用以下URL:

Screenshot of URL's in UNICODE

...我应该使用String来处理什么句柄。

到目前为止,我一直无法处理那个String,我所拥有的只是????字符。

感谢。

于2012.09.09修改:

package pruebas;

import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Vector;

public class Prueba03
{
    public static void main(String argumentos[])
    {
        Vector<String> listaURLs = new Vector<String>();

        listaURLs.add("http://президент.рф/");
        listaURLs.add("http://www.中国政府.政务.cn");
        listaURLs.add("http://www.原來我不帥.cn/");
        listaURLs.add("http://وزارة-الأتصالات.مصر/");

        URL currentURL;
        URLConnection currentConnection;
        int currentSize;

        for(int i=0; i<listaURLs.size(); i++)
        {
            try
            {
                System.out.println(URLDecoder.decode(listaURLs.get(i), URLEncoder.encode(listaURLs.get(i), "UTF-8")));
            } // End of the try.
            catch(UnsupportedEncodingException uee)
            {
                uee.printStackTrace();
            } // End of the catch.
            catch(Exception e)
            {
                e.printStackTrace();
            } // End of the catch.

            try
            {
                currentURL = new URL(listaURLs.get(i));
                System.out.println("currentURL" + " = " + currentURL);

                currentConnection = currentURL.openConnection();
                System.out.println("currentConnection" + " = " + currentConnection);

                currentSize = currentConnection.getContentLength();
                System.out.println("currentSize" + " = " + currentSize);
            } // End of the try.
            catch(Exception e)
            {
                e.printStackTrace();
            } // End of the catch.
        } // End of the for.
    } // End of the main method.
} // End of the Prueba02 class.

4 个答案:

答案 0 :(得分:0)

对于域名,您应该使用Punycode转换unicode主机名。 Punycode是一种将unicode字符串转换为ascii字符串的方法。

以下链接显示了将Unicode域名转换为国际域名的JAVA方法。 https://docs.oracle.com/javase/6/docs/api/java/net/IDN.html#toASCII(java.lang.String)

    URL u = new URL(url);
    String host = u.getHost();

    String[] labels = host.split("\\.");
    for (int i = 0; i < labels.length; i++) {
        labels[i] = java.net.IDN.toUnicode(labels[i]);
    }
    host = StringUtils.join(labels, ".");
    System.out.println(host);

此外,您可以使用在线punycode转换器测试一些unicode URL。 https://www.punycoder.com/

例如,&#34; http://www.中国政府.政务.cn&#34;转换为&#34; http://www.xn--fiqs8sirgfmh.xn--zfr164b.cn/&#34;。

答案 1 :(得分:-1)

您可以尝试以下代码:

import java.net.URLDecoder;
import java.net.URLEncoder;

public class Test7 {
public static void main(String[] args) throws Exception {
    String str = "http://www.中国政府.政务.cn";
    System.out.println(URLDecoder.decode(str, URLEncoder.encode(str,
            "UTF-8")));
    }
}

答案 2 :(得分:-2)

不确定“解析”是什么意思 - 你打算用这些部分做什么?
据我所知,阿拉伯语和俄语都是UTF-8支持的。
不确定你的数据源是什么(可能是某种类型的流?)但是String有一个接受所需编码的CTOR。
你应该能够获得一个不包含???的字符串如果您使用此CTOR(使用“UTF-8”参数)

,则需要阿拉伯语和俄语

答案 3 :(得分:-2)

您可以尝试使用以下内容:

String pageUrl = "http://www.中国政府.政务.cn";

try 
{
        URL url = new URL(pageUrl);
        System.out.println(url.toURI().toASCIIString());
}

catch (MalformedURLException e1) 
{
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

catch (URISyntaxException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

结果如预期: http://www.%E4%B8%AD%E5%9B%BD%E6%94%BF%E5%BA%9C.%E6%94%BF%E5%8A%A1.cn

但转换为URI有其自身的劣势,您应该将'|', '"', '#'等特殊字符手动替换为URL编码。