我试图在包含特殊字符的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函数,该函数显然不需要在另一边解码。:)
对于其他在这个问题上绊倒的人
一个可能的解决方案是使用org.apache.commons.httpclient.util.URIUtil#编码器查询
如果您使用的是最新的httpclient 4,则可以使用URIParserUtil#escapeChars
。
示例代码:URIUtil。编码查询(strQuery)//httpclient3。芦丁。逃逸卡(strQuery)//httpclient4。x
根据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,令人惊讶的是,它在那里工作。 我哪里做错了? 原始代码: 输出:未打印任何内容