7

我有一个这样的字符串

"\x27\x18\xf6,\x03\x12\x8e\xfa\xec\x11\x0dHL"

当我把它放在浏览器控制台中时,它会自动变成别的东西:

"\x27\x18\xf6,\x03\x12\x8e\xfa\xec\x11\x0dHL"
"'ö,úìHL"

如果我chatAt(x)对这个字符串进行处理,我会得到:

"\x27\x18\xf6,\x03\x12\x8e\xfa\xec\x11\x0dHL".charAt(0)
"'"
"\x27\x18\xf6,\x03\x12\x8e\xfa\xec\x11\x0dHL".charAt(1)
""
"\x27\x18\xf6,\x03\x12\x8e\xfa\xec\x11\x0dHL".charAt(2)
"ö"

这就是我想要的。

现在我想实现一个 Java 程序,它以与浏览器中相同的方式读取字符串。

问题是,Java 无法识别此字符串的编码方式。相反,它将其视为普通字符串:

"\\x27\\x18\\xf6,\\x03\\x12\\x8e\\xfa\\xec\\x11\\x0dHL".charAt(0) == '\'
"\\x27\\x18\\xf6,\\x03\\x12\\x8e\\xfa\\xec\\x11\\x0dHL".charAt(1) == 'x'
"\\x27\\x18\\xf6,\\x03\\x12\\x8e\\xfa\\xec\\x11\\x0dHL".charAt(2) == '2'

这个字符串是用什么样的编码编码的?什么样的编码使用前缀\x?有没有办法正确阅读它(获得与浏览器相同的结果)?

更新:我找到了一个解决方案-> 我想这不是最好的,但它对我有用:

StringEscapeUtils.unescapeJava("\\x27\\x18\\xf6,\\x03\\x12\\x8e\\xfa\\xec\\x11\\x0dHL".replace("\\x", "\\u00"))

谢谢大家的回复:)尤其是里卡多·卡西拉(Ricardo Cacheira)

谢谢

4

2 回答 2

10

\x03是 char 的 ASCII 十六进制值

所以这:"\x30\x31"与:"01"

看到那个页面:http ://www.asciitable.com

另一件事是当您复制不带引号的字符串时,您的IDE将任何转换\\\

Java String 使用 unicode 转义,因此:"\x30\0x31"在 java 中是:"\u0030\u0031"

您不能在 Java String 中使用这些转义序列,\u000a AND \u000d您应该将其分别转换为\r AND \n

所以这"\u0027\u0018\u00f6,\u0003\u0012\u008e\u00fa\u00ec\u0011\rHL"是Java的转换:"\x27\x18\xf6,\x03\x12\x8e\xfa\xec\x11\x0dHL"

于 2013-05-23T22:20:03.233 回答
1

apache commons 为此提供了一个助手:

StringEscapeUtils.unescapeJava(...)

取消转义在字符串中找到的任何 Java 文字。例如,它会将 '\' 和 'n' 的序列转换为换行符,除非 '\' 前面有另一个 '\'。

于 2013-05-23T22:22:49.900 回答