将任意转义字符转换为int

时间:2015-04-02 14:03:19

标签: java casting escaping

我有一个方法,最后采用一个字符数组(带一个元素),并返回该字符的强制转换:

char[] first = {'a'};
return (int)first[0];

但是,有时我有两个元素的字符数组,其中第一个始终是“\”(即它是一个“包含”转义字符的字符数组):

char second = {'\\', 'n'};

我想返回(int)'\n',但我不知道如何将该数组转换为单个转义字符。我可以检查数组是否长度为1或2,但我真的不想让一个长开关或if / else块来检查每个可能的转义字符。

4 个答案:

答案 0 :(得分:1)

如何制作逃脱角色的HashMap与第二个?像:

Map<Character, int> escapeMap = new HashMap<>();
escapeMap.put('n', 10);

然后做出类似的事情:

If (second[0] == '\\') {
 return escapeMap.get(second[1]);
}
else
{
  return (int)first[0];
}

答案 1 :(得分:0)

您可以使用映射将转义序列映射存储到其对应的字符。如果您假设转义序列始终只是一个代码低于128的字符,则可以将映射简化为如下所示:

char[] escaped = {..., '\n', ...'\t', ...}

字符'\n'位于数组的(int)'n'位置。

然后你会找到escaped[(int)second[1]]的转义字符。如果找到无效的转义序列,您只需要检查数组边界。

答案 2 :(得分:0)

这是一个丑陋的黑客。这对我有用,但似乎不可靠,有缺陷且耗时(因此不要在关键部分使用它)。

char[] second = {'\\','n'};
String s = new String(second);
//write the String to an OutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(baos));
writer.write("key=" + s);
writer.close();
//load the String using Properties
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
Properties prop = new Properties();
prop.load(bais);
baos.close();
bais.close();
//now get the character
char c = prop.getProperty("key").charAt(0);
System.out.println((int)c);

输出:10(这是System.out.println((int)'\n');的输出)

答案 3 :(得分:0)

打印(int)'a'时,正在打印UniCode表中该字符的十进制值。如果a93http://unicode-table.com/en/

\n被识别为(Uni)代码LF,这意味着换行或换行。在Unicode表中,与十进制数10相同。如果您编写:System.out.println((int)'\n');

,确实会打印出来

同样适用于具有特殊含义的字符\b\f\r\t' , \', \“and \\编译器并为LF设置了\n之类的特殊字符代码。如果您想了解详细信息,请查找它们。

从这个角度来看,最简单的解决方案是:

    char[] second = {'\\', 'n'};
    if (second.length > 1) {
        System.out.println((int)'\n');
    } else {
        System.out.println(second[0]);
    }

仅当\n是您遇到的唯一escape sequence时才是。