簡體   English   中英

從Java中的VBScript解碼轉義的字符串

[英]Decode an escaped string from VBScript in Java

我試圖解碼以下字符串,

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)

字符串的來源是使用Escape函數的VBS腳本。 如何解碼此字符串?

不幸的是,通過閱讀文檔,Microsoft似乎又做了一次(tm):“非標准xxx”,此處的“ xxx”是“轉義格式”。

具體來說,在VBScript函數的文檔中 ,據說:

使用%uxxxx格式存儲值大於255的Unicode字符。

(嘿,MS:沒有“ Unicode字符”之類的東西;這些被稱為代碼點

大。 因此,您需要自己的解碼功能。

幸運的是,我們使用Java。 並且由於此專有轉義序列僅涵蓋基本多語言平面中的Unicode代碼點(U + 0000至U + FFFF), 並且 char是UTF-16代碼單元, 並且 BMP和UTF之間存在一對一的映射關系-16,這讓我們的工作變得更輕松

這是代碼:

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));
    }
}

輸出:

AT&amp;T Network Client – IBM

String str = "AT%26amp%3BT%20Network%20Client%20%[here]u[here]2013%20IBM"我認為此字符串無效。 %u20不是有效的字符。 如果從字符串中刪除u ,則可以對其進行編碼。 供參考: w3schools html url編碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM