在java URI中编码一个英镑符号

use*_*369 6 java uri urlencode

我有一个java程序,它应该从URL读取文件(URL位置是IIS网站下的虚拟目录;下面,在我的初始测试中,我将其视为任何其他文件系统位置).不幸的是,所有需要读取的文件的路径都包含一个目录名中的井号(#),而我无法改变它.当(作为测试)我将它指向路径中没有英镑符号的位置时,该程序可以很好地工作.

我首先从传递给程序的字符串创建一个URL.对于像/Documents/#2012/09/11(文件是Windows共享)这样的文件路径,如果我在命令行上传递了这样的路径,我可以让程序成功处理:

file://serverIPaddress/Documents/\%232012/09/07/16/DOC4671179.DOC
Run Code Online (Sandbox Code Playgroud)

也就是说,用英镑符号手动编码为%23,并且反斜杠转移%23的%.

获取该URL只有一行:

URL url = new URL(filePath); // filePath is passed in
Run Code Online (Sandbox Code Playgroud)

但是这个程序不会被这样的编码路径用勺子喂食,所以我不得不弄清楚如何以编程方式对井号进行编码.继续找到关于如何编码URL以避免java中的特殊字符的好建议,我使用多参数构造函数创建了一个URI(我将已传递给程序的参数分解为三个单独的参数以适应该更改) .这是看起来像:

URI uri = new URI(protocol, host, filePath, null); // all values are passed in
Run Code Online (Sandbox Code Playgroud)

这恰好编码了英镑符号; 我的URI是:

file://serverIPaddress/Documents/%232012/09/07/16/DOC4671179.DOC
Run Code Online (Sandbox Code Playgroud)

但是如果没有前面的反斜杠%23,程序就会回来Connection refused,大概是因为它没有反斜杠的好处而误解了路径.

所以我想,好吧,我会自己添加反斜杠.我创建了相同的URI,提取了它的rawPath,并且通过一些字符串操作,在%23前面加了一个反斜杠.然后我使用新字符串创建了一个新的URI:

URI uri = new URI(protocol, host, filePath, null); // all values are passed in
String rawPath = uri.getRawPath();
int pctPos = rawPath.indexOf("%");
String escaped = new String("\\");
String firstPart = rawPath.substring(0,pctPos);
String secondPart = rawPath.substring(pctPos);
String newPath = firstPart + escaped + secondPart;
URI uri2 = new URI(protocol, host, newPath, null);
Run Code Online (Sandbox Code Playgroud)

但是,可以预见,这给了我一个像这样的URI:

file://<serverIPaddress>/Documents/%5C%25232012/09/07/16/DOC4671179.DOC
Run Code Online (Sandbox Code Playgroud)

同时使用反斜杠和%编码.有道理,但仍然无法在执行时工作.

URL API说:

URL类本身不会根据RFC2396中定义的转义机制对任何URL组件进行编码或解码.调用者负责编码任何字段,在调用URL之前需要对其进行转义

所以我想,好吧,我不会创建第二个URI,而是根据我在上次尝试中生成的新字符串创建一个URL:

URI uri = new URI(protocol, host, filePath, null); // all values are passed in
String rawPath = uri.getRawPath();
int pctPos = rawPath.indexOf("%");
String escaped = new String("\\");
String firstPart = rawPath.substring(0,pctPos);
String secondPart = rawPath.substring(pctPos);
String newPath = firstPart + escaped + secondPart;
URL url = new URL(protocol + "://" + host + newPath);
Run Code Online (Sandbox Code Playgroud)

但在这种方法中,即使我的新路径看起来很好:

/Documents/\%232012/09/07/16/DOC4671179.DOC
Run Code Online (Sandbox Code Playgroud)

生成的URL返回为:

file://serverIPAddress/Documents//%232012/09/07/16/DOC4671179.DOC
Run Code Online (Sandbox Code Playgroud)

在%23之前使用额外的正斜杠而不是反斜杠.

而且我已经没有想法了.

  • 是什么让最后一种方法中的反斜杠变成了URL中的正斜杠?

  • 我该怎么办才能获得我需要的URI/URL?

  • 或许我应该问:为什么程序需要%23中的%才能首先进行转义,如果%23是合法URI或URL的一部分,那么我可以做些什么呢?

irr*_*ble 0

不知道为什么需要“\”。这取决于服务器代码。实际上“\”不是 URL 中的合法字符,它应该编码为 %5C

URI班级相当混乱。它可能会默默地将文件 URL 的“\”更改为“/”。

试试这个:

    String filePath = "/Documents/#2012/09/11";
    filePath = filePath.replace("#", "\\#");
    URI uri = new URI("file", "serverAddress", filePath, null);
Run Code Online (Sandbox Code Playgroud)

“#”将更改为“%5C%23”。看看是否有效。