如何使用Java将*abracadabra*转换回字符串,就像它转换JavaScript解码组件(escape(x))一样?

如何使用Java将*abracadabra*转换回字符串,就像它转换JavaScript解码组件(escape(x))一样?,java,decode,encode,Java,Decode,Encode,我有一个字符串(每字节十六进制表示): [代码>

我有一个字符串(每字节十六进制表示):

[代码><0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\xC3\x90\xC2\xB0\xC3\x91\xC2\x82\xC3\x91\xC2\x80\xC3\x90\xC2\xB8\xC3\x90\xC2\xB1\xC3\x91\xC2\x83\xC3\x91\xC2\xC2\xC3\x90\xC2\xBE\xC3\x90\xC2\xC3\x90\xC2\XC4\xC3\x90\xC2\xBE\xC3\x90\xC2\xBA\xC3\x91\xC2\x83\xC3\x90\xC2\xC2\xBC\xC3\xC3\x90\xC2\xC3\xC3\xC2\xC3\xC3\x90\xC2\XCD\xC3\x91\xC2\xC3\xC2\XC0\XC1\XC1\XC1\XC1

它看起来就像这样:

[代码]

你可以用它来看看。只需将十六进制序列粘贴到那里的
\xXX
字段中,字符串就会显示在
纯文本
字段中

此字符串[2]应在(未知且明显错误)编码后恢复

如果(在同一网站上)您将从
纯文本
复制abracadabra[2]并将其粘贴到
引用的可打印文件
,您将在
纯文本
字段中看到解码文件:

ббббббббббббббббббб

同样可以通过
decodeURIComponent(escape(x))
使用JavaScript,其中
x
包含abracadabra字符串[2]

所以我的问题是:如何使用Java从abracadabra[2]恢复原始字符串[3]


Thankyou

字符串包含字符,其中字符是一个两字节的UTF-16值。包含文本的字节、二进制数据必须与编码相关联,因为字符串包含Unicode。Java在
byte
char
之间引入了这种明显的区别

使用regex replace可以手动转换为:

    byte[] arr = {(byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0x9E, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x88, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB8, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB1, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xBA, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB0, (byte) 0x20, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB2, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB0, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xBB, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB8, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB4, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB0, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x86, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB8, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB8, (byte) 0x20, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB0, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x82, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x80, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB8, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB1, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x83, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x82, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xBE, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB2, (byte) 0x20, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB4, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xBE, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xBA, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x83, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xBC, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB5, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xBD, (byte) 0xC3, (byte) 0x91, (byte) 0xC2, (byte) 0x82, (byte) 0xC3, (byte) 0x90, (byte) 0xC2, (byte) 0xB0};
    String s = new String(arr, StandardCharsets.UTF_8);
翻译带有反斜杠、x和两个十六进制数字的ASCII文本必须如下所示:

    String t = "\\xC3\\x90\\xC2\\x9E\\xC3\\x91\\xC2\\x88\\xC3\\x90\\xC2\\xB8\\xC3\\x90\\xC2\\xB1\\xC3\\x90\\xC2\\xBA\\xC3\\x90\\xC2\\xB0\\x20\\xC3\\x90\\xC2\\xB2\\xC3\\x90\\xC2\\xB0\\xC3\\x90\\xC2\\xBB\\xC3\\x90\\xC2\\xB8\\xC3\\x90\\xC2\\xB4\\xC3\\x90\\xC2\\xB0\\xC3\\x91\\xC2\\x86\\xC3\\x90\\xC2\\xB8\\xC3\\x90\\xC2\\xB8\\x20\\xC3\\x90\\xC2\\xB0\\xC3\\x91\\xC2\\x82\\xC3\\x91\\xC2\\x80\\xC3\\x90\\xC2\\xB8\\xC3\\x90\\xC2\\xB1\\xC3\\x91\\xC2\\x83\\xC3\\x91\\xC2\\x82\\xC3\\x90\\xC2\\xBE\\xC3\\x90\\xC2\\xB2\\x20\\xC3\\x90\\xC2\\xB4\\xC3\\x90\\xC2\\xBE\\xC3\\x90\\xC2\\xBA\\xC3\\x91\\xC2\\x83\\xC3\\x90\\xC2\\xBC\\xC3\\x90\\xC2\\xB5\\xC3\\x90\\xC2\\xBD\\xC3\\x91\\xC2\\x82\\xC3\\x90\\xC2\\xB0";
    Matcher m = Pattern.compile("\\\\x(..)").matcher(t);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while (m.find()) {
        baos.write(Integer.parseInt(m.group(1), 16));
    }
    s = baos.toString(StandardCharsets.UTF_8);
在这两种情况下,解码为UTF-8的原始字节。然而,字符串仍然是 “已编码。”实际上是两次UTF-8编码,这是一个错误,不能保证不编码/解码是可能的

黑客破解的目的是将每个字符解释为字节。为此,请使用单字节编码。有标准提供的字符集ISO-8859-1

    byte[] arr2 = s.getBytes(StandardCharsets.ISO_8859_1);
    s = new String(arr2, StandardCharsets.UTF_8);

    System.out.println(s);
现在输出是可读的

Ошибка валидации атрибутов документа
讽刺的是,这意味着“验证文档属性时出错”