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”
作为要输出的字符串)。