当前位置: 首页 > 知识库问答 >
问题:

如何让Java匹配JavaScript编码器URIComponent()方法?

东郭宏朗
2023-03-14

我试图在包含特殊字符的URL中传递这个字符串,唯一能让它工作的方法是使用JavaScript encodeURIComponent('tester')ๆ๘ๅ') 它生产“测试员æå”

我在Java中尝试做的每件事都会产生不同的编码,而在另一端不起作用。。。你知道我怎么才能拿到测试仪吗ๆ๘ๅ 用Java编码到测试员æå?提前谢谢!

package com.mastercard.cp.sdng.domain.user;

import org.apache.commons.lang.StringUtils;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;

public class UrlEncodingSample
{
    public static void main(String[] args)
    {
        String userId = "dummy";
        try
        {
            validateEncoding(userId);

            userId = "testeræøå";

            validateEncoding(userId);

            userId = URLEncoder.encode(userId);

            validateEncoding(userId);
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }

    private static void validateEncoding(String userId) throws UnsupportedEncodingException
    {
        System.out.println("------ START TESTING WITH USER ID = '"+userId+"' ----------------------");
        System.out.println("Test URLEncoder.encode(userId): " + URLEncoder.encode(userId));
        System.out.println("Test URLEncoder.encode(userId,\"UTF-8\"): " + URLEncoder.encode(userId, "UTF-8"));
        System.out.println("Test URLEncoder.encode(userId,\"UTF-16\"): " + URLEncoder.encode(userId,"UTF-16"));
        System.out.println("Test URLEncoder.encode(userId,\"UTF-16LE\"): " + URLEncoder.encode(userId,"UTF-16LE"));
        System.out.println("Test URLEncoder.encode(userId,\"UTF-16BE\"): " + URLEncoder.encode(userId,"UTF-16BE"));

        ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
        try
        {
            System.out.println("Test engine.eval(\"encodeURIComponent(\\\"\"+userId+\"\\\")\"): " +
                    engine.eval("encodeURIComponent(\""+userId+"\")"));
        }
        catch (ScriptException e)
        {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        System.out.println("Test encodeURIComponent(userId): " + encodeURIComponent(userId));
        try
        {
            System.out.println("TEST new URI(userId).toASCIIString(): " + new URI(userId).toASCIIString());
        }
        catch (URISyntaxException e)
        {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        System.out.println("------ END TESTING WITH USER ID = '"+userId+"' ----------------------\n\n");

    }



    public static String encodeURIComponent(String input) {
        if(StringUtils.isEmpty(input)) {
            return input;
        }

        int l = input.length();
        StringBuilder o = new StringBuilder(l * 3);
        try {
            for (int i = 0; i < l; i++) {
                String e = input.substring(i, i + 1);
                if (ALLOWED_CHARS.indexOf(e) == -1) {
                    byte[] b = e.getBytes("utf-8");
                    o.append(getHex(b));
                    continue;
                }
                o.append(e);
            }
            return o.toString();
        } catch(UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return input;
    }

    private static String getHex(byte buf[]) {
        StringBuilder o = new StringBuilder(buf.length * 3);
        for (int i = 0; i < buf.length; i++) {
            int n = (int) buf[i] & 0xff;
            o.append("%");
            if (n < 0x10) {
                o.append("0");
            }
            o.append(Long.toString(n, 16).toUpperCase());
        }
        return o.toString();
    }

    public static final String ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";
}

上述类的输出如下所示:


    ------ START TESTING WITH USER ID = 'dummy' ----------------------
    Test URLEncoder.encode(userId): dummy
    Test URLEncoder.encode(userId,"UTF-8"): dummy
    Test URLEncoder.encode(userId,"UTF-16"): dummy
    Test URLEncoder.encode(userId,"UTF-16LE"): dummy
    Test URLEncoder.encode(userId,"UTF-16BE"): dummy
    Test engine.eval("encodeURIComponent(\""+userId+"\")"): dummy
    Test encodeURIComponent(userId): dummy
    TEST new URI(userId).toASCIIString(): dummy
    ------ END TESTING WITH USER ID = 'dummy' ----------------------


    ------ START TESTING WITH USER ID = 'testerๆ๘ๅ' ----------------------
    Test URLEncoder.encode(userId): tester%E6%F8%E5
    Test URLEncoder.encode(userId,"UTF-8"): tester%E0%B9%86%E0%B9%98%E0%B9%85
    Test URLEncoder.encode(userId,"UTF-16"): tester%FE%FF%0E%46%0E%58%0E%45
    Test URLEncoder.encode(userId,"UTF-16LE"): tester%46%0E%58%0E%45%0E
    Test URLEncoder.encode(userId,"UTF-16BE"): tester%0E%46%0E%58%0E%45
    Test engine.eval("encodeURIComponent(\""+userId+"\")"): tester%e0%b9%86%e0%b9%98%e0%b9%85
    Test encodeURIComponent(userId): tester%E0%B9%86%E0%B9%98%E0%B9%85
    TEST new URI(userId).toASCIIString(): tester%E0%B9%86%E0%B9%98%E0%B9%85
    ------ END TESTING WITH USER ID = 'testerๆ๘ๅ' ----------------------


    ------ START TESTING WITH USER ID = 'tester%E6%F8%E5' ----------------------
    Test URLEncoder.encode(userId): tester%25E6%25F8%25E5
    Test URLEncoder.encode(userId,"UTF-8"): tester%25E6%25F8%25E5
    Test URLEncoder.encode(userId,"UTF-16"): tester%FE%FF%00%25E6%FE%FF%00%25F8%FE%FF%00%25E5
    Test URLEncoder.encode(userId,"UTF-16LE"): tester%25%00E6%25%00F8%25%00E5
    Test URLEncoder.encode(userId,"UTF-16BE"): tester%00%25E6%00%25F8%00%25E5
    Test engine.eval("encodeURIComponent(\""+userId+"\")"): tester%25E6%25F8%25E5
    Test encodeURIComponent(userId): tester%25E6%25F8%25E5
    TEST new URI(userId).toASCIIString(): tester%E6%F8%E5
    ------ END TESTING WITH USER ID = 'tester%E6%F8%E5' ----------------------

注意:当我写这篇文章的时候,我突然想到我可以使用URLEncoder.encode(userId,“UTF-8”),只要我在另一边使用合适的解码器...但是我仍然在努力寻找一种方法编码它以匹配JavaScript编码URIComponent函数,该函数显然不需要在另一边解码。:)

共有2个答案

石正奇
2023-03-14

对于其他在这个问题上绊倒的人

一个可能的解决方案是使用org.apache.commons.httpclient.util.URIUtil#编码器查询

如果您使用的是最新的httpclient 4,则可以使用URIParserUtil#escapeChars

示例代码:URIUtil。编码查询(strQuery)//httpclient3。芦丁。逃逸卡(strQuery)//httpclient4。x

邢永安
2023-03-14

根据Mozilla开发者的说法,Docs encodeuricomponent()使用UTF-8进行编码。当我在你的琴弦上运行时,我得到了预期的测试器æå。当我运行以下Java代码时:

System.out.println(URLEncoder.encode("testeræøå", "UTF-8"));

它还打印测试器æå。我还运行了您的测试并获得:

    ------ START TESTING WITH USER ID = 'dummy' ----------------------
Test URLEncoder.encode(userId): dummy
Test URLEncoder.encode(userId,"UTF-8"): dummy
Test URLEncoder.encode(userId,"UTF-16"): dummy
Test URLEncoder.encode(userId,"UTF-16LE"): dummy
Test URLEncoder.encode(userId,"UTF-16BE"): dummy
Test engine.eval("encodeURIComponent(\""+userId+"\")"): dummy
Test encodeURIComponent(userId): dummy
TEST new URI(userId).toASCIIString(): dummy
------ END TESTING WITH USER ID = 'dummy' ----------------------


------ START TESTING WITH USER ID = 'testeræøå' ----------------------
Test URLEncoder.encode(userId): tester%C3%A6%C3%B8%C3%A5
Test URLEncoder.encode(userId,"UTF-8"): tester%C3%A6%C3%B8%C3%A5
Test URLEncoder.encode(userId,"UTF-16"): tester%FE%FF%00%E6%00%F8%00%E5
Test URLEncoder.encode(userId,"UTF-16LE"): tester%E6%00%F8%00%E5%00
Test URLEncoder.encode(userId,"UTF-16BE"): tester%00%E6%00%F8%00%E5
Test engine.eval("encodeURIComponent(\""+userId+"\")"): tester%C3%A6%C3%B8%C3%A5
Test encodeURIComponent(userId): tester%C3%A6%C3%B8%C3%A5
TEST new URI(userId).toASCIIString(): tester%C3%A6%C3%B8%C3%A5
------ END TESTING WITH USER ID = 'testeræøå' ----------------------


------ START TESTING WITH USER ID = 'tester%C3%A6%C3%B8%C3%A5' ----------------------
Test URLEncoder.encode(userId): tester%25C3%25A6%25C3%25B8%25C3%25A5
Test URLEncoder.encode(userId,"UTF-8"): tester%25C3%25A6%25C3%25B8%25C3%25A5
Test URLEncoder.encode(userId,"UTF-16"): tester%FE%FF%00%25C3%FE%FF%00%25A6%FE%FF%00%25C3%FE%FF%00%25B8%FE%FF%00%25C3%FE%FF%00%25A5
Test URLEncoder.encode(userId,"UTF-16LE"): tester%25%00C3%25%00A6%25%00C3%25%00B8%25%00C3%25%00A5
Test URLEncoder.encode(userId,"UTF-16BE"): tester%00%25C3%00%25A6%00%25C3%00%25B8%00%25C3%00%25A5
Test engine.eval("encodeURIComponent(\""+userId+"\")"): tester%25C3%25A6%25C3%25B8%25C3%25A5
Test encodeURIComponent(userId): tester%25C3%25A6%25C3%25B8%25C3%25A5
TEST new URI(userId).toASCIIString(): tester%C3%A6%C3%B8%C3%A5
------ END TESTING WITH USER ID = 'tester%C3%A6%C3%B8%C3%A5' ----------------------

这是我所期望的。

我认为您需要检查Java源文件的文件编码。如果您使用的是Eclipse,出于某种原因,它默认为cp1252。安装Eclipse时,我要做的第一件事是将默认编码更改为UTF-8。

 类似资料:
  • 问题内容: 争论的Mockito匹配器(如,,,,和)从Hamcrest匹配器表现非常不同。 匹配器经常导致,即使在使用任何匹配器很长时间后执行的代码中也是如此。 匹配器遵循怪异的规则,例如,如果给定方法中的一个参数使用匹配器,则仅要求对所有参数使用Mockito匹配器。 当覆盖或使用时,匹配器可能导致 。 使用Mockito匹配器以某些方式重构代码会产生异常和意外行为,并且可能会完全失败。 为什

  • 本文向大家介绍匹配邮政编码的Java程序,包括了匹配邮政编码的Java程序的使用技巧和注意事项,需要的朋友参考一下 假设我们有以下邮政编码。 现在,设置以下正则表达式以匹配美国的邮政编码。 示例 输出结果

  • 我试图使用JUnit/Hamcrest断言集合至少包含一个自定义逻辑断言为true的元素。我希望有像“anyOf”这样的匹配器,它采用lambda(或匿名类定义),在这里我可以定义自定义逻辑。我试过TypeSafeMatcher,但不知道该怎么处理它。 我不认为任何一个是我想要的,因为这似乎需要一个匹配者的名单。

  • 我目前正在学习Spring Boot framework,并试图按照baledung页面上的指南创建一个自定义字段匹配验证器。 我的代码实际上和上面的页面一样,唯一不同的是我用BCryptPasswordEncoder编码了密码。 这是我的用户类。 控制器: 注册用户方法: 我收到了以下错误: 我认为编码的密码正在与未编码的验证密码进行比较。这就是为什么我收到这个错误或?我怎么才能修好它?如果我也

  • 问题内容: 这是一个分为两个部分的问题。 我的文档如下所示: 我的第一个问题是如何检索“ title” 恰好是 “ No Title”的所有文档。我不希望出现标题为“此文档没有标题”的文档。 我的第二个问题是如何检索“ URL” 恰好 出现在一长串URL中的所有文档。 我正在使用pyelasticsearch,但是在curl中使用通用答案也可以。 问题答案: 如果您存储了源代码(这是默认设置),则

  • 这是一个示例文本:。我无法修改输入文本,我正在从文件中读取长字符串文本。 我想提取以下内容:,,, 为此,我编写了以下正则表达式模式: 我正在使用和类,但是我的Matcher无法使用前面提到的正则表达式找到模式。我在一些在线regex网站上用文本测试了这个regex,令人惊讶的是,它在那里工作。 我哪里做错了? 原始代码: 输出:未打印任何内容