1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package ch.qos.cal10n.util;
23
24
25
26
27 public class LexicalUtil {
28
29
30 public static StringBuilder convertSpecialCharacters(StringBuilder inBuf) {
31
32 int i = inBuf.indexOf("\\");
33
34 if (i == -1) {
35 return inBuf;
36 }
37
38 StringBuilder outBuf = new StringBuilder(inBuf.length());
39
40 int last = -1;
41 while (i != -1) {
42 outBuf.append(inBuf.subSequence(last + 1, i));
43 last = i + 1;
44 char next = inBuf.charAt(last);
45 switch (next) {
46 case 'u':
47 char unicodeChar = readUnicode(inBuf, last + 1);
48 outBuf.append(unicodeChar);
49 last += 4;
50 break;
51 case 'n':
52 outBuf.append('\n');
53 break;
54 case 'r':
55 outBuf.append('\r');
56 break;
57 case 't':
58 outBuf.append('\t');
59 break;
60 case 'f':
61 outBuf.append('\f');
62 break;
63 default:
64 outBuf.append('\\');
65 outBuf.append(next);
66
67 }
68 i = inBuf.indexOf("\\", last);
69 }
70 outBuf.append(inBuf.subSequence(last + 1, inBuf.length()));
71 return outBuf;
72 }
73
74
75
76 private static char readUnicode(StringBuilder inBuf, int i) {
77 int r = 0;
78 for (int j = i; j < i + 4; j++) {
79 char atJ = inBuf.charAt(j);
80
81 if (atJ >= '0' && atJ <= '9') {
82 r = (r << 4) + atJ - '0';
83 continue;
84 }
85 if (atJ >= 'A' && atJ <= 'F') {
86
87 r = (r << 4) + atJ - '7';
88 continue;
89 }
90 if (atJ >= 'a' && atJ <= 'f') {
91
92 r = (r << 4) + atJ - 'W';
93 continue;
94 }
95 }
96 return (char) r;
97 }
98 }