如何解决Java %u20AC 转换为欧元 €
如何转换如下字符串:
URLDecoder.decode("promo desc %u20AC","UTF-16");
进入“promo desc €”? 事实上,上面的方法不起作用,因为 % 表示一个十六进制字符串,而 u20AC 不是一个有效的十六进制字符串。 要解码的字符串由 Javascript 生成,如下所示:
var string = escape("{€ć") ---> "%7B%u20AC%u0107"
我不想使用 URLDecoder,因为从语义上讲,它不是我要解码的 URL,而是很长的文本。在 java 中 % 表示十六进制字符串,而 %u 是非法的。我认为将 % 转换为 \ 有点幼稚,文本中可能会有 % 的序列。 我所追求的是这里的功能:
unescape("%7B%u20AC%u0107")
就我所知,它存在于 Javascript 中,但不存在于 Java 中。我如何在 Java 中实现这一点?
谢谢
解决方法
我很好奇,因为我以前从未见过 %u 转义,但事实证明对它们进行转义相当容易:
private static final Pattern JAVASCRIPT_ESCAPE_SEQUENCE= Pattern.compile("%(u[0-9a-fA-F]{4}|[0-9a-fA-F]{2})");
/**
* Unescape a JavaScript-escaped string.
* Undoes the effect of calling the <a href="https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/escape">
* the JavaScript escape method</a>.
*/
static String unescape(String input) {
Matcher matcher = JAVASCRIPT_ESCAPE_SEQUENCE.matcher(input);
StringBuilder sb = new StringBuilder(input.length());
while(matcher.find()) {
String escapeSequence = matcher.group(1);
if (escapeSequence.startsWith("u")) {
escapeSequence = escapeSequence.substring(1);
}
char c = (char) Integer.parseInt(escapeSequence,16);
matcher.appendReplacement(sb,Character.toString(c));
}
matcher.appendTail(sb);
return sb.toString();
}
鉴于此方法 unescape("%7B%u20AC%u0107")
产生所需的输出 {€ć
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。