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") 产生所需的输出 {€ć