一尘不染

Java与产生相同输出的JavaScript的encodeURIComponent等效吗?

javascript

我一直在尝试各种Java代码,试图提出一些将对包含引号,空格和“奇异”
Unicode字符的字符串进行编码的东西,并产生与JavaScript的encodeURIComponent函数相同的输出。

我的酷刑测试字符串是: “ A” B±“

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

encodeURIComponent('"A" B ± "');

—然后我得到:

"%22A%22%20B%20%C2%B1%20%22"

这是我的小测试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"));
  }
}

—该程序输出:

URLEncoder.encode返回%22A%22 + B +%C2%B1 +%22
getBytes返回“ A” B±“

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

编辑: 我正在使用Java 1.4即将移至Java 5。


阅读 616

收藏
2020-05-01

共1个答案

一尘不染

查看实现差异,我发现:

MDCencodeURIComponent()

  • 文字字符(正则表达式表示): [-a-zA-Z0-9._*~'()!]

Java
1.5.0文档URLEncoder

  • 文字字符(正则表达式表示): [-a-zA-Z0-9._*]
  • 空格字符" "将转换为加号"+"

因此,基本上,要获得所需的结果,请使用URLEncoder.encode(s, "UTF-8")然后进行一些后处理:

  • 替换所有出现的"+""%20"
  • 替换所有"%xx"代表[~'()!]其文字对应部分的所有出现
2020-05-01