相关疑难解决方法(0)

Java相当于生成相同输出的JavaScript的encodeURIComponent?

我一直在试验各种Java代码试图想出一些东西,它将编码一个包含引号,空格和"奇异"Unicode字符的字符串,并产生与JavaScript的encodeURIComponent函数相同的输出.

我的折磨测试字符串是:"A"B±"

如果我在Firebug中输入以下JavaScript语句:

encodeURIComponent('"A" B ± "');
Run Code Online (Sandbox Code Playgroud)

- 然后我得到:

"%22A%22%20B%20%C2%B1%20%22"
Run Code Online (Sandbox Code Playgroud)

这是我的小测试Java程序:

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class EncodingTest
{
  public static void main(String[] args) throws UnsupportedEncodingException
  {
    String s = "\"A\" B ± \"";
    System.out.println("URLEncoder.encode returns "
      + URLEncoder.encode(s, "UTF-8"));

    System.out.println("getBytes returns "
      + new String(s.getBytes("UTF-8"), "ISO-8859-1"));
  }
}
Run Code Online (Sandbox Code Playgroud)

- 该计划输出:

URLEncoder.encode returns %22A%22+B+%C2%B1+%22
getBytes returns "A" B ± "

关闭,但没有雪茄!使用Java编码UTF-8字符串的最佳方法是什么,以便它产生与JavaScript相同的输出encodeURIComponent

编辑:我很快就使用Java 1.4迁移到Java 5.

javascript java unicode utf-8

84
推荐指数
5
解决办法
11万
查看次数

如何强制URIBuilder.path(...)编码像"%AD"这样的参数?此方法并不总是正确地使用百分比编码参数

如何强制URIBuilder.path(...)编码参数如"%AD"

的方法path,replacePathsegmentURIBuilder并不总是编码参数与百分比,正确.

当参数包含字符"%"后跟两个字符一起形成URL编码字符时,"%"不会编码为"%25".

例如

URI uri = UriBuilder.fromUri("https://dummy.com").queryParam("param", "%AD");
String test = uri.build().toString();
Run Code Online (Sandbox Code Playgroud)

"test"是" https://dummy.com?param=%AD "
但它应该是" https://dummy.com?param=%25AD "(字符"%"编码为"%25")

UriBuilderImpl.queryParam(...)当"%"后面的两个字符是十六进制时,该方法的行为与此类似.即,方法"com.sun.jersey.api.uri.UriComponent.isHexCharacter(char)"对于"%"之后的字符返回true.

我认为UriBuilderImpl的行为是正确的,因为我猜它试图不编码已编码的参数.但在我的场景中,我永远不会尝试使用已经编码的参数创建URL.

我该怎么办?

我的Web应用程序使用新泽西州,在许多地方我建立一个使用类UriBuilder的URI或调用该方法getBaseUriBuilderUriInfo对象.

每次调用方法时queryParam,我都可以用"%25"替换"%" ,replaceQueryParam或者segment.但我正在寻找一个不那么麻烦的解决方案.

如何让Jersey返回我自己的UriBuilder实现?

我想过创建一个扩展UriBuilderImpl的类来覆盖这些方法,并在调用之前执行此替换super.queryParam(...)或其他任何操作.

在调用UriBuilder.fromURL(...)UriInfo.getBaseUriBuilder(...)等时,有没有办法让Jersey返回我自己的UriBuilder而不是UriBuilderImpl ?

看看这个方法RuntimeDelegate,我想到了扩展RuntimeDelegateImpl.我的实现将覆盖该方法createUriBuilder(...),该方法将返回我自己的方法UriBuilder,而不是UriBuilderImpl.然后,我会添加文件,META-INF/services/javax.ws.rs.ext.RuntimeDelegate并在其中,我的完整的类名称RuntimeDelegateImpl.

问题是jersey-bundle.jar已包含META-INF/services/javax.ws.rs.ext.RuntimeDelegate指向的内容com.sun.jersey.server.impl.provider.RuntimeDelegateImpl,因此容器加载该文件而不是my javax.ws.rs.ext.RuntimeDelegate.因此,它不会加载我的RuntimeDelegate实现. …

jax-rs jersey jersey-1.0

17
推荐指数
3
解决办法
3万
查看次数

标签 统计

java ×1

javascript ×1

jax-rs ×1

jersey ×1

jersey-1.0 ×1

unicode ×1

utf-8 ×1