You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:46