如何将字符串转换(反转义)为字符,在java中例如将"\\n"转换为'\n'。

11 浏览
0 Comments

如何将字符串转换(反转义)为字符,在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\"?

0
0 Comments

在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类的私有方法来实现的,所以不能直接在其他类中使用。但是,我们可以参考这个方法的实现思路,自己编写一个类似的方法来实现字符串到字符的转换。这样我们就可以在任何需要的地方使用这个方法了。

0