Java读取含汉字域名图片URL失败:UnknownHostException报错排查
解决Java加载国际化域名图片时的UnknownHostException问题
你的问题核心在于对IDN(国际化域名)的转码方向搞反啦!咱们来一步步拆解:
错误原因分析
java.net.UnknownHostException: 見.香港 说明DNS服务器没法识别这个Unicode格式的域名——因为DNS系统本质上只支持ASCII字符,Unicode域名必须先转成**Punycode(ASCII形式的IDN编码)**才能被解析。而你用了IDN.toUnicode(url),这是把Punycode转成Unicode的反向操作,等于反而把域名变成了DNS无法识别的格式,自然找不到主机。
正确的处理方式
你需要用IDN.toASCII()把Unicode域名转成Punycode,而且要注意只转域名部分,不要把URL里的路径也一起转(路径需要用URL编码,不是IDN转码)。修正后的代码如下:
import java.net.URL; import java.net.IDN; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; public class ImageLoader { public static void main(String[] args) throws Exception { String unicodeUrl = "http://見.香港/images/wonton.jpg"; URL originalUrl = new URL(unicodeUrl); // 把Unicode域名转成Punycode格式的ASCII域名 String asciiHost = IDN.toASCII(originalUrl.getHost()); // 重新构建包含正确编码域名的URL URL correctedUrl = new URL( originalUrl.getProtocol(), asciiHost, originalUrl.getPort(), originalUrl.getFile() ); BufferedImage bi = ImageIO.read(correctedUrl); System.out.println(bi); } }
关键细节说明
IDN.toASCII():负责将Unicode域名转换为DNS可识别的Punycode(比如見.香港会被转成xn--n8j6ds53lwwkrq.xn--j6w193g)- 拆分URL处理:直接对整个URL调用
IDN.toASCII()可能会破坏路径部分的编码,所以一定要单独提取域名部分转码后再重新拼接URL
这样修改后,Java就能正确解析域名并获取图片输入流啦!
内容的提问来源于stack exchange,提问作者Joris Schellekens
相关产品推荐
相关产品推荐

