Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java%u20AC转换为欧元&x20AC;_Java_Utf 8_Decode - Fatal编程技术网

Java%u20AC转换为欧元&x20AC;

Java%u20AC转换为欧元&x20AC;,java,utf-8,decode,Java,Utf 8,Decode,如何转换字符串,如: URLDecoder.decode("promo desc %u20AC", "UTF-16"); “促销说明”? 事实上,上述方法不起作用,因为%表示十六进制字符串,而u20AC不是有效的十六进制字符串。 要解码的字符串由如下Javascript生成: var string = escape("{€ć") ---> "%7B%u20AC%u0107" 我不想使用URL解码器,因为从语

如何转换字符串,如:

URLDecoder.decode("promo desc %u20AC", "UTF-16");
“促销说明”? 事实上,上述方法不起作用,因为%表示十六进制字符串,而u20AC不是有效的十六进制字符串。 要解码的字符串由如下Javascript生成:

var string = escape("{€ć") ---> "%7B%u20AC%u0107"
我不想使用URL解码器,因为从语义上讲,我要解码的不是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();
}
private static final Pattern JAVASCRIPT_ESCAPE_SEQUENCE=Pattern.compile(%%(u[0-9a-fA-F]{4}|[0-9a-fA-F]{2});
/**
*Unescape一个JavaScript转义字符串。
*撤消调用的效果。
*/
静态字符串unescape(字符串输入){
Matcher Matcher=JAVASCRIPT\u ESCAPE\u SEQUENCE.Matcher(输入);
StringBuilder sb=新的StringBuilder(input.length());
while(matcher.find()){
字符串转义序列=matcher.group(1);
if(escapeSeSequence.startsWith(“u”)){
escapeSequence=escapeSequence.子字符串(1);
}
char c=(char)Integer.parseInt(escapeSequence,16);
匹配器。替换(sb,字符。toString(c));
}
(某人);
使某人返回字符串();
}

给定此方法
unescape(“%7B%u20AC%u0107”)
生成所需的输出
{€ć

首先去掉百分号?这个坏数据来自哪里?你能修复它而不必处理它吗?根本没有坏数据,代码来自javascript中的函数escape,它将欧元转换为%u20AC。同样,它将ä转换为%E4,需要将其转换回ä。所以基本上是Javascript转义(“€”)= %U20AC--> java应该翻译成欧元。我不能替换%,因为我也会损坏可能的%。我必须找到其他符号的通用解决方案,如%E4等等。有任何想法吗?如果答案已经解决了,请点击检查标记。这向更广泛的社区表明你已经找到了解决方案。给回答者和你自己带来一些声誉。如果给出的答案中还有任何不清楚的地方,请毫不犹豫地使用答案下的注释功能提问。非常感谢,但它不起作用。它生成:{€?此外,它不是StringBuilder,而是StringBuffer。如何获得所需的输出“{€ć”?StringBuffer是这里不需要的较旧的同步版本。StringBuffer和StringBuilder都使用Pattern/Matcher(从Java 9开始,如果你被困在古老的旧世界,那么你需要使用StringBuffer,是的)。是的:它确实有效,我已经验证过了。如果你得到
{€?
然后在稍后的某个点上出现了一个问题,使用的编码不能表示最后一个字符。打印
(int)output.charAt(2)
,您将看到
ć
的值是263,而不是63(这将是
)。我试着在上面运行它,它可以工作。我的设置哪里会有问题?我的意思是为什么我的java环境不能表示字符ć?此外,我在云中的servlet中使用了这个例程,我得到了相同的结果,同样的问题。我应该设置一些特定的编码吗?这可能有很多不同的原因。有在评论中分析这一点毫无意义。也许可以作为一个新问题来提问。如果您确实这样做,请确保它尽可能独立(例如,跳过解码此转义部分,只使用
“\u0107”
作为要输出的字符串)。