- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在包含特殊字符的 URL 中传递此字符串,我可以让它工作的唯一方法是使用 JavaScript encodeURIComponent('testerๆ๘ๅ') 生成 "tester%C3%A6 %C3%B8%C3%A5”
我在 Java 中尝试做的所有事情都会产生不同的编码,并且在另一端不起作用...知道如何将 testerๆ๘ๅ 编码为 tester%C3%A6%C3%B8%C3%A5在 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 encodeURIComponent 函数,该函数显然无需在另一端对其进行解码即可工作。 :)
最佳答案
根据 Mozilla Developer Docs encodeURICompoent() 使用 UTF-8 编码。当我在你的字符串上运行它时,我会按预期得到 tester%C3%A6%C3%B8%C3%A5 。当我运行以下 Java 代码时:
System.out.println(URLEncoder.encode("testeræøå", "UTF-8"));
它还打印 tester%C3%A6%C3%B8%C3%A5。我也运行了你的测试并得到:
------ 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。
关于java - 如何让 Java 匹配 JavaScript 的 encodeURIComponent() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298063/
要么我在 java 脚本中的 encodeURICOmponent() 添加了很多字符,要么我不明白它是如何工作的。 我正在使用这行代码: var encoded = encodeURICom
我正在尝试对来自文本区域的字符串进行编码,以便我可以为 mailto 链接输出编码结果。空格和特殊字符的编码很好,但换行符不是,它们只是被编码为空格。 如何对我的换行符进行编码? if (id ==
我有更多这样的 DIV: Fri November 9, 2012 所有这些都在一个变量中。示例: var = ' ...Fri November 9, 2012... ...Fri November
出于某种原因,我在使用 javascript encodeURIcomponent 函数的编码 URI 中获得了额外的代码,即 %25 字符: 我的职能是: function twit_click()
我在 encodeURIComponent 函数的帮助下使用用户提供的输入以编程方式构建 URI。但是,当用户输入无效的 unicode 字符(例如 U+DFFF)时,该函数会抛出异常并显示以下消息:
encodeURIComponent 在主要浏览器中的实现效率如何?是否值得记住对encodeURIComponent 的调用? 最佳答案 这听起来像是过早的优化。 除非您对页面进行了分析并发现 en
由于 javascript 的 encodeURIComponent() 对除之外的所有内容进行编码 (alphabetic) (decimal digits) - _ . ! ~ * ' ( ) 并
我希望它能工作 var url = 'http://path_to_some_image.jpg'; $('body').css('background-image', "url('" + encod
jQuery.ajax() 在转义我的数据时做了一些奇怪的事情。 例如,如果我发送请求: $.ajax({ url: 'somethinguninteresting', data: {
在向服务器执行 http-get 请求时,我仍然不明白的是使用 JS 函数 encodeURIcomponent 对 http-get 的每个组件进行编码的优势是什么。 在做一些测试时,我发现如果我不
我有一个带有文本输入的表单,其 ID 为 txtPlace,用户将在其中输入内容,并将作为 url 查询传递给服务器。我正在尝试使用 encodeURIComponent(),但它不是编码空格。这是我
w3schools以下是关于 encodeURIComponent 函数的内容: This function encodes special characters. In addition, it e
native encodeURIComponent 不支持编码感叹号 - ! 我需要在 url 的查询参数中正确编码.. node.js querystring.stringify() 也没有.. 是
我正在从 bower 迁移到 yarn ,并且在我的 bower.json 中文件我有这个依赖: Snap.svg": "snap.svg#^0.4.1 当我尝试在 yarn 依赖项文件中执行相同操作
我想问你是否有必要使用mysql_real_escape_string()如果数据在我的 JS 文件中使用 encodeURIComponent() 编码,则我在 PHP ajax 文件中发送到我的数
encodeURIComponent 转义除以下字符之外的所有字符:- _。 ! ~ * ' ( ) 但是是否可以扩展对上述特殊字符进行编码的功能。 我知道我可以做这样的事情: encodeURICo
有没有办法在 Javascript 的 encodeURI() 或 encodeURIComponent() 中指定字符集?例如: encodeURIComponent("例子", "UTF-8")
我需要对表单输入进行 URI 编码,然后用一堆隐藏的输入序列化并发送到 PHP 文件。是否有可能以某种方式将 encodeURIComponent 组合到这一行中?: var landingCreat
我想对我的 URL 进行编码,但我想将空格转换为加号。 这就是我试图做的...... var search = "Testing this here &"; encodeURIComponent(se
我在谷歌搜索时遇到了问题。 Objective-C 是否有对 URI 组件进行编码的等效方法? http://www.w3schools.com/jsref/jsref_encodeuricompon
我是一名优秀的程序员,十分优秀!