Java Apache公共URL验证程序不支持unicode。阿勒诺的有效期是多少?

Java Apache公共URL验证程序不支持unicode。阿勒诺的有效期是多少?,java,validation,url,Java,Validation,Url,我尝试进行url验证。 但是UrlValidator不支持unicode。 这是代码 public static boolean isValidHttpUrl(String url) { String[] schemes = {"http", "https"}; UrlValidator urlValidator = new UrlValidator(schemes); if (urlValidator.isValid(url)) { System.out

我尝试进行url验证。 但是UrlValidator不支持unicode。 这是代码

public static boolean isValidHttpUrl(String url) {
    String[] schemes = {"http", "https"};
    UrlValidator urlValidator = new UrlValidator(schemes);
    if (urlValidator.isValid(url)) {
        System.out.println("url is valid");
        return true;
    }
    System.out.println("url is invalid");
    return false;
}

String url = "ftp://hi.com";
boolean isValid = isValidHttpUrl(url);
assertFalse(isValid);

url = "http:// hi.com";
isValid = isValidHttpUrl(url);
assertFalse(isValid);

url = "http://hi.com";
isValid = isValidHttpUrl(url);
assertTrue(isValid);

// this is problem... it's not true... 
url = "http://안녕.com";
isValid = isValidHttpUrl(url);
assertTrue(isValid);
你知道有其他url验证程序支持unicode吗

我加上一些例子。。。这是无效的。为什么?
underbar是有效域为什么无效?

可能有一个较新的RFC取代了此RFC,但从技术上讲,URL不支持Unicode或Unicode

有关章节特别指出:

没有相应的图形US-ASCII:

URL仅使用
US-ASCII编码字符集。这个 八位字节80-FF十六进制不是
用于US-ASCII和八位字节00-1F 和7F十六进制表示
控制字符;这些一定是 编码的


它不支持IDN。您需要先将URL转换为Punycode。试试这个

  isValid = isValidHttpUrl(IDN.toASCII(url));
正如在对已接受答案的评论中提到的,如果字符串以scheme开头,那么就有一个bug。 下面是我的解决方案:

public静态字符串转换器unicodeurltoascii(字符串url)抛出URISyntaxException{
如果(url==null){
返回null;
}
url=url.trim();
URI=新的URI(url);
布尔includeScheme=true;
//URI需要一个方案来正确处理权限解析
if(uri.getScheme()==null){
uri=新uri(“http://”+url);
包容性原则=错误;
}
字符串scheme=uri.getScheme()!=null?uri.getScheme()+“:/”:null;
字符串authority=uri.getRawAuthority()!=null?uri.getRawAuthority():“”;//包括域和端口
字符串路径=uri.getRawPath()!=null?uri.getRawPath():“”;
字符串queryString=uri.getRawQuery()!=null?“+uri.getRawQuery():”;
字符串片段=uri.getRawFragment()!=null?#“+uri.getRawFragment():”;
//必须将域与路径分别转换为punycode
url=(includeScheme?scheme:)+IDN.toASCII(authority)+path+queryString+fragment;
//将路径从unicode转换为ascii编码
返回新的URI(url).normalize().toASCIIString();
}

域名中不允许使用下划线。嗯。。。但有些子域是可用的。。我也爱你。下划线传统上被URI RFC禁止,但现在它们在web上使用。现在,根据新的标准,它们是允许的。如果URL包含方案(“http://”),则此代码会错误地转换URL。至少已经有4个标准取代了此标准;)