如何将字符串转换(反转义)为字符,在java中例如将"\\n"转换为'\n'。
如何将字符串转换(反转义)为字符,在java中例如将"\\n"转换为'\n'。
我正在处理一些混合了utf-16和ascii的文件,例如:\n\\u6b64\\u626b\\u63cf: abc\n在Java中,我会得到\"\\\\u6b64\\\\u626b\\\\u63cf: abc\"(字符串长度为29)。\n如何将它转换为\"\\u6b64\\u626b\\u63cf: abc\"(字符串长度为8)?\n我知道Apache Commons库中有StringEscapeUtils,但我更倾向于不使用外部库。\n或者,有没有可能直接读取为\"\\u6b64\\u626b\\u63cf: abc\"?
在Java中,有时候需要将字符串转换为字符,例如将"\\n"转换为'\n'。然而,似乎没有一个通用的库可以直接完成这个转换。但是,在Properties类中我找到了一个私有方法loadConvert,它完全解决了这个问题。
下面是这个loadConvert方法的代码:
private String loadConvert(char[] in, int off, int len, char[] convtBuf) { if (convtBuf.length < len) { int newLen = len * 2; if (newLen < 0) { newLen = Integer.MAX_VALUE; } convtBuf = new char[newLen]; } char aChar; char[] out = convtBuf; int outLen = 0; int end = off + len; while (off < end) { aChar = in[off++]; if (aChar == '\\') { aChar = in[off++]; if(aChar == 'u') { // Read the xxxx int value = 0; for (int i = 0; i < 4; i++) { aChar = in[off++]; switch (aChar) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': value = (value << 4) + aChar - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': value = (value << 4) + 10 + aChar - 'a'; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': value = (value << 4) + 10 + aChar - 'A'; break; default: throw new IllegalArgumentException( "Malformed \\uxxxx encoding."); } } out[outLen++] = (char)value; } else { if (aChar == 't') aChar = '\t'; else if (aChar == 'r') aChar = '\r'; else if (aChar == 'n') aChar = '\n'; else if (aChar == 'f') aChar = '\f'; out[outLen++] = aChar; } } else { out[outLen++] = aChar; } } return new String(out, 0, outLen); }
这个方法可以将输入的字符串转换为字符,并返回一个新的字符串。它使用了一个临时的字符数组convtBuf来存储转换后的字符。方法中的while循环遍历输入的字符数组,并根据字符的不同进行相应的转义处理。如果字符是'\\',则检查下一个字符,如果是'u',则将其后的四个字符解析为一个Unicode字符。如果不是'u',则根据具体的转义字符进行转换。如果字符不是'\\',则直接将其添加到输出字符数组中。
这个方法是通过Properties类的私有方法来实现的,所以不能直接在其他类中使用。但是,我们可以参考这个方法的实现思路,自己编写一个类似的方法来实现字符串到字符的转换。这样我们就可以在任何需要的地方使用这个方法了。