View Javadoc

1   package org.dfdaemon.il2.core.util;
2   
3   /**
4    * @author Ivan Luzyanin
5    */
6   public class StringUtils {
7   
8       /**
9        * Converts encoded \uxxxx to unicode chars
10       * and changes special saved chars to their original forms
11       *
12       * @param theString ascii encoded string
13       * @return decoded native (utf8) string
14       */
15      public static String ascii2native(String theString) {
16          char aChar;
17          int len = theString.length();
18          StringBuffer outBuffer = new StringBuffer(len);
19  
20          for (int x = 0; x < len;) {
21              aChar = theString.charAt(x++);
22              if (aChar == '\\') {
23                  aChar = theString.charAt(x++);
24                  if (aChar == 'u') {
25                      // Read the xxxx
26                      int value = 0;
27                      for (int i = 0; i < 4; i++) {
28                          aChar = theString.charAt(x++);
29                          switch (aChar) {
30                              case '0':
31                              case '1':
32                              case '2':
33                              case '3':
34                              case '4':
35                              case '5':
36                              case '6':
37                              case '7':
38                              case '8':
39                              case '9':
40                                  value = (value << 4) + aChar - '0';
41                                  break;
42                              case 'a':
43                              case 'b':
44                              case 'c':
45                              case 'd':
46                              case 'e':
47                              case 'f':
48                                  value = (value << 4) + 10 + aChar - 'a';
49                                  break;
50                              case 'A':
51                              case 'B':
52                              case 'C':
53                              case 'D':
54                              case 'E':
55                              case 'F':
56                                  value = (value << 4) + 10 + aChar - 'A';
57                                  break;
58                              default:
59                                  throw new IllegalArgumentException("Malformed \\uxxxx encoding.");
60                          }
61                      }
62                      outBuffer.append((char) value);
63                  } else {
64                      if (aChar == 't') {
65                          aChar = '\t';
66                      } else if (aChar == 'r') {
67                          aChar = '\r';
68                      } else if (aChar == 'n') {
69                          aChar = '\n';
70                      } else if (aChar == 'f') aChar = '\f';
71                      outBuffer.append(aChar);
72                  }
73              } else {
74                  outBuffer.append(aChar);
75              }
76          }
77          return outBuffer.toString();
78      }
79  
80      /**
81       * Converts unicodes to encoded &#92;uxxxx
82       * and writes out any of the characters in special chars <code>= \t\r\n\f#</code>
83       * with a preceding slash
84       *
85       * @param theString   native utf8 string
86       * @param escapeSpace if true space will be encoded too.
87       * @return encoded to ascii string
88       */
89      public static String native2ascii(String theString, boolean escapeSpace) {
90          int len = theString.length();
91          StringBuffer outBuffer = new StringBuffer(len * 2);
92  
93          for (int x = 0; x < len; x++) {
94              char aChar = theString.charAt(x);
95              switch (aChar) {
96                  case ' ':
97                      if (x == 0 || escapeSpace) {
98                          outBuffer.append('\\');
99                      }
100 
101                     outBuffer.append(' ');
102                     break;
103                 case '\\':
104                     outBuffer.append('\\');
105                     outBuffer.append('\\');
106                     break;
107                 case '\t':
108                     outBuffer.append('\\');
109                     outBuffer.append('t');
110                     break;
111                 case '\n':
112                     outBuffer.append('\\');
113                     outBuffer.append('n');
114                     break;
115                 case '\r':
116                     outBuffer.append('\\');
117                     outBuffer.append('r');
118                     break;
119                 case '\f':
120                     outBuffer.append('\\');
121                     outBuffer.append('f');
122                     break;
123                 default:
124                     if ((aChar < 0x0020) || (aChar > 0x007e)) {
125                         outBuffer.append('\\');
126                         outBuffer.append('u');
127                         outBuffer.append(HEX_DIGIT[((aChar >> 12) & 0xF & 0xF)]);
128                         outBuffer.append(HEX_DIGIT[((aChar >> 8) & 0xF & 0xF)]);
129                         outBuffer.append(HEX_DIGIT[((aChar >> 4) & 0xF & 0xF)]);
130                         outBuffer.append(HEX_DIGIT[(aChar & 0xF & 0xF)]);
131                     } else {
132                         if (SPECIAL_SAVE_CHARS.indexOf(aChar) != -1) {
133                             outBuffer.append('\\');
134                         }
135                         outBuffer.append(aChar);
136                     }
137             }
138         }
139         return outBuffer.toString();
140     }
141 
142     /**
143      * A table of hex digits
144      */
145     private static final char[] HEX_DIGIT = {
146             '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
147     };
148 
149     private static final String SPECIAL_SAVE_CHARS = "= \t\r\n\f#";
150 
151 }