在Java中解码VBScript中的转义字符串

在Java中解码VBScript中的转义字符串,java,vbscript,character-encoding,escaping,decoding,Java,Vbscript,Character Encoding,Escaping,Decoding,我试图解码以下字符串 String str = "AT%26amp%3BT%20Network%20Client%20%u2013%20IBM"; System.out.println(StringEscapeUtils.unescapeHtml(str)); try { System.out.println("res:"+java.net.URLDecoder.decode(str, "UTF-8")); } catch (UnsupportedEncodingException

我试图解码以下字符串

String str  = "AT%26amp%3BT%20Network%20Client%20%u2013%20IBM";

System.out.println(StringEscapeUtils.unescapeHtml(str));
try {
    System.out.println("res:"+java.net.URLDecoder.decode(str, "UTF-8"));
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
两种方法都失败了,如下所示:

AT%26amp%3BT%20Network%20Client%20%u2013%20IBM
Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u2"
    at java.net.URLDecoder.decode(URLDecoder.java:173)
    at decrypt.DecryptHtml.main(DecryptHtml.java:19)
该字符串的源是使用的VBS脚本。如何解码此字符串?

string str=“AT%26amp%3BT%20网络%20客户端%20%[here]u[here]2013%20IBM”
我认为这个字符串无效<代码>%u20是无效字符。 如果从字符串中删除
u
,则可以对其进行编码。
参考:

不幸的是,从阅读文档来看,微软似乎又做了一次(tm):“非标准xxx”,这里的“xxx”是“转义格式”

具体地说,在中,据说:

值大于255的[…]Unicode字符使用%uxxx格式存储

(嘿,小姐:没有“Unicode字符”这类东西;它们被称为代码点)

太好了。所以你需要自己的解码功能

幸运的是,我们使用Java。由于这个专有的转义序列只覆盖基本多语言平面(U+0000到U+FFFF)中的Unicode代码点,并且由于
char
是一个UTF-16代码单元,并且由于BMP和UTF-16之间有一个1对1的映射,这使得我们的工作更容易一些

代码如下:

public final class MSUnescaper
{
    private static final char PERCENT = '%';
    private static final char NONSTANDARD_PCT_ESCAPE = 'u';

    private MSUnescaper()
    {
    }

    public static String unescape(final String input)
    {
        final StringBuilder sb = new StringBuilder(input.length());
        final CharBuffer buf = CharBuffer.wrap(input);

        char c;

        while (buf.hasRemaining()) {
            c = buf.get();
            if (c != PERCENT) {
                sb.append(c);
                continue;
            }
            if (!buf.hasRemaining())
                throw new IllegalArgumentException();
            c = buf.get();
            sb.append(c == NONSTANDARD_PCT_ESCAPE
                ? msEscape(buf) : standardEscape(buf, c));
        }

        return sb.toString();
    }

    private static char standardEscape(final CharBuffer buf, final char c)
    {
        if (!buf.hasRemaining())
            throw new IllegalArgumentException();
        final char[] array = { c, buf.get() };
        return (char) Integer.parseInt(new String(array), 16);
    }

    private static char msEscape(final CharBuffer buf)
    {
        if (buf.remaining() < 4)
            throw new IllegalArgumentException();
        final char[] array = new char[4];
        buf.get(array);
        return (char) Integer.parseInt(new String(array), 16);
    }

    public static void main(final String... args)
    {
        final String input = "AT%26amp%3BT%20Network%20Client%20%u2013%20IBM";
        System.out.println(unescape(input));
    }
}

“字符串的源是使用Escape函数的VBS文件”什么
Escape
函数?因为它看起来像是URI编码的,但是有错误。具体来说,它有
%u
,这在URI编码中是无效的。
StringEscapeUtils.unescapeHtml()
在这里不起作用;这些是百分比编码转义,而不是HTML转义序列。十六进制值的范围是从小数
0
7F
,小数
0
127
。字符
u
将永远不会出现。它必须是无效的编码字符串。必须手动输入。@itsraja请参阅我的答案,因为它是一个unicode字符
'\u2013'
要表示
\ucode>下划线,字符串缺少字符
u
前的反斜杠@Ravinder:不,关键是这是MS自己的编码。如果他们希望
%u2013
表示Unicode代码点2013,他们可以。(我得到的是
“–”
,不是下划线。)是的,是连字符,不是下划线。我明白如何解决这个问题。我只是想分析字符串“%u2013”是否可以转换为unicode字符。它仍然缺少一个反斜杠字符。如果我删除转义函数,我将得到AT&;T Network Client-IBM,我能够正确地解码它,但我最终遇到了另一个问题,出现了另一个结果字符串,如“Remote Control AyĤame Premium”,当在浏览器中打开时,它会抛出“格式不正确”@Ravinder:不,它没有遗漏任何内容。它不是Java字符串unicode转义。这是一个MS伪URI转义。我已经更改了您的链接标题,W3C与W3C没有任何关联。这不是OP要求的。查看他添加到MS文档的链接
AT&amp;T Network Client – IBM