|
|
java中文与转义串(形如..\xC4\xDA\xB9\xDB...带 \xNN 的转义串)的相互转换函数
分两步说:
1)有类似 `...\xC4\xDA\xB9\xDB...` 这样的转义串,要先还原回原始字节;
2)再按正确的字符集(GBK/UTF‑8 等)把字节解码成中文字符串。
下面是成对的“编码/解码”工具方法,方便你来回互转(示例用 GBK,对应你前面 `\xC4\xDA...` 的情况):
```java
import java.nio.charset.Charset;
public class HexEscapeUtil {
// 中文 -> 带 \xNN 的转义串
public static String toHexEscaped(String input, String charsetName) {
if (input == null) return null;
Charset charset = Charset.forName(charsetName);
byte[] bytes = input.getBytes(charset);
StringBuilder sb = new StringBuilder(bytes.length * 4);
for (byte b : bytes) {
int v = b & 0xFF;
// 可见 ASCII 直接保留,其他转为 \xNN
if (v >= 0x20 && v <= 0x7E && b != '\\') {
sb.append((char) v);
} else {
sb.append("\\x");
String hex = Integer.toHexString(v).toUpperCase();
if (hex.length() == 1) sb.append('0');
sb.append(hex);
}
}
return sb.toString();
}
// 带 \xNN 的转义串 -> 中文
public static String fromHexEscaped(String escaped, String charsetName) {
if (escaped == null) return null;
Charset charset = Charset.forName(charsetName);
byte[] buf = new byte[escaped.length()]; // 足够大
int pos = 0;
for (int i = 0; i < escaped.length(); ) {
char c = escaped.charAt(i);
if (c == '\\' && i + 3 < escaped.length()
&& escaped.charAt(i + 1) == 'x') {
// 解析 \xNN
String hex = escaped.substring(i + 2, i + 4);
int v = Integer.parseInt(hex, 16);
buf[pos++] = (byte) v;
i += 4;
} else {
// 普通字符按单字节写回
buf[pos++] = (byte) c;
i++;
}
}
return new String(buf, 0, pos, charset);
}
public static void main(String[] args) {
String original = "Gate_104:114:A-ZShuolong\\Data\\01\\内管台账.pak";
String escaped = toHexEscaped(original, "GBK");
System.out.println(escaped);
// Gate_104:114:A-ZShuolong\Data\01\xC4\xDA\xB9\xDB\xCC\xD8\xD0\xA7.pak
String restored = fromHexEscaped(escaped, "GBK");
System.out.println(restored);
// Gate_104:114:A-ZShuolong\Data\01\内管台账.pak
}
}
```
用法说明:
- 编码成转义串:
`String escaped = HexEscapeUtil.toHexEscaped(chineseStr, "GBK");`
- 再还原为中文:
`String restored = HexEscapeUtil.fromHexEscaped(escaped, "GBK");`
关键点:
- 字符集要和当初生成 `\xC4\xDA...` 时用的一致(你这类值通常是 GBK;如果确认是 UTF‑8,就把 `"GBK"` 换成 `"UTF-8"`)。
- 这套方法可以用于你在 Java 中调试:从 Redis 里读到的原始 key,用 `toHexEscaped` 打印成人能看的 `\x..`,需要回转成中文时再用 `fromHexEscaped`。
|
|