为什么Java会自动解码URI编码文件名中的%2F?

Luc*_*cas 6 java encoding uri file

我有一个servlet,需要写出具有用户可配置名称的文件.我正在尝试使用URI编码来正确转义特殊字符,但JRE似乎会自动将编码的正斜杠%2F转换为路径分隔符.

例:

File   dir = new File("C:\Documents and Setting\username\temp");
String fn  = "Top 1/2.pdf";
URI    uri = new URI( dir.toURI().toASCIIString() + URLEncoder.encoder( fn, "ASCII" ).toString() );
File   out = new File( uri );

System.out.println( dir.toURI().toASCIIString() );
System.out.println( URLEncoder.encode( fn, "ASCII" ).toString() );
System.out.println( uri.toASCIIString() );
System.out.println( output.toURI().toASCIIString() );
Run Code Online (Sandbox Code Playgroud)

输出是:

file:/C:/Documents%20and%20Settings/username/temp/
Top+1%2F2.pdf   
file:/C:/Documents%20and%20Settings/username/temp/Top+1%2F2.pdf
file:/C:/Documents%20and%20Settings/username/temp/Top+1/2.pdf
Run Code Online (Sandbox Code Playgroud)

在实例化新的File对象之后,%2F序列会自动转换为正斜杠,并且最终会出现错误的路径.有人知道解决这个问题的正确方法吗?

问题的核心似乎就是这样

uri.equals( new File(uri).toURI() ) == FALSE
Run Code Online (Sandbox Code Playgroud)

%2FURI中有一个时.

我打算只是逐字地使用URLEncoded字符串而不是尝试使用File(uri)构造函数.

Bal*_*usC 5

new File(URI)结构由由此获得的路径上的文件URI#getPath(),而不是你expected- -什么URI#getRawPath().这看起来像是"按设计"的特征.

你有2个选择:

  1. 运行URLEncoder#encode()fn两次(注意:encode()不是encoder()).
  2. new File(String)改用.