Java - 特殊URL字符

Nol*_*esh 6 java

我有一个功能:

public static ImageIcon GetIconImageFromResource(String path){
    URL url = ARMMain.class.getResource(path);
return new ImageIcon(url);
} 
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但如果我将我的.JAR文件放在例如C:\ Ares !!!\myfile.jar上它就会失败,我看不到我的图标.我发现我的URL是文件:/ C:/ Ares !!!/myfile.jar!/com/test/images/img.png.所以在JAR扩展之后就有了!符号!我认为这是主要原因!我该怎么做才能避免这个问题?谢谢.

irr*_*ble 5

这显然是Java的一个问题(不仅仅是一个bug).JAR URL !/用作分隔符,但在文件路径中出现时不会将其转义.

你可以尝试自己逃避它,Ares!!!/变成Ares!!%21/,但保持myfile.jar!/原样.


根据RFC3986,!是一个保留的子分隔符char.因此,使用它来分隔URL中的不同部分是安全的; 当它出现在一个部件内时,它必须被转义为%21

但是,处理JAR URL的Java代码显然遵循较旧的RFC2396,其中!是一个无保留的char.Java选择一个未保留的char作为分隔符是不明智的.当它发生时,它应该至少在内部逃脱它,好像保留了字符.