我正在阅读一些utf-16和ascii混合文件,例如: \ u6b64 \ u626b \ u63cf:abc
我将在java中获得“\\ u6b64 \\ u626b \\ u63cf:abc”(字符串长度为29)。 如何将其转换为“\ u6b64 \ u626b \ u63cf:abc”(字符串长度为8)?
我知道Apache Commons库中有StringEscapeUtils,但我不想使用外部库。
或者,我是否有可能直接将其读到“\ u6b64 \ u626b \ u63cf:abc”?
答案 0 :(得分:0)
似乎没有一般的lib可供使用。 但我在java的Properties类中找到了这个私有方法,它完全解决了我的问题。
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); }