1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.mortbay.util;
16
17 import java.io.UnsupportedEncodingException;
18
19
20
21
22
23
24
25
26
27
28
29 public class StringUtil
30 {
31 public static final String CRLF="\015\012";
32 public static final String __LINE_SEPARATOR=
33 System.getProperty("line.separator","\n");
34
35 public static final String __ISO_8859_1;
36 static
37 {
38 String iso=System.getProperty("ISO_8859_1");
39 if (iso==null)
40 {
41 try{
42 new String(new byte[]{(byte)20},"ISO-8859-1");
43 iso="ISO-8859-1";
44 }
45 catch(java.io.UnsupportedEncodingException e)
46 {
47 iso="ISO8859_1";
48 }
49 }
50 __ISO_8859_1=iso;
51 }
52
53
54 public final static String __UTF8="UTF-8";
55 public final static String __UTF16="UTF-16";
56
57
58 private static char[] lowercases = {
59 '\000','\001','\002','\003','\004','\005','\006','\007',
60 '\010','\011','\012','\013','\014','\015','\016','\017',
61 '\020','\021','\022','\023','\024','\025','\026','\027',
62 '\030','\031','\032','\033','\034','\035','\036','\037',
63 '\040','\041','\042','\043','\044','\045','\046','\047',
64 '\050','\051','\052','\053','\054','\055','\056','\057',
65 '\060','\061','\062','\063','\064','\065','\066','\067',
66 '\070','\071','\072','\073','\074','\075','\076','\077',
67 '\100','\141','\142','\143','\144','\145','\146','\147',
68 '\150','\151','\152','\153','\154','\155','\156','\157',
69 '\160','\161','\162','\163','\164','\165','\166','\167',
70 '\170','\171','\172','\133','\134','\135','\136','\137',
71 '\140','\141','\142','\143','\144','\145','\146','\147',
72 '\150','\151','\152','\153','\154','\155','\156','\157',
73 '\160','\161','\162','\163','\164','\165','\166','\167',
74 '\170','\171','\172','\173','\174','\175','\176','\177' };
75
76
77
78
79
80
81
82 public static String asciiToLowerCase(String s)
83 {
84 char[] c = null;
85 int i=s.length();
86
87
88 while (i-->0)
89 {
90 char c1=s.charAt(i);
91 if (c1<=127)
92 {
93 char c2=lowercases[c1];
94 if (c1!=c2)
95 {
96 c=s.toCharArray();
97 c[i]=c2;
98 break;
99 }
100 }
101 }
102
103 while (i-->0)
104 {
105 if(c[i]<=127)
106 c[i] = lowercases[c[i]];
107 }
108
109 return c==null?s:new String(c);
110 }
111
112
113
114 public static boolean startsWithIgnoreCase(String s,String w)
115 {
116 if (w==null)
117 return true;
118
119 if (s==null || s.length()<w.length())
120 return false;
121
122 for (int i=0;i<w.length();i++)
123 {
124 char c1=s.charAt(i);
125 char c2=w.charAt(i);
126 if (c1!=c2)
127 {
128 if (c1<=127)
129 c1=lowercases[c1];
130 if (c2<=127)
131 c2=lowercases[c2];
132 if (c1!=c2)
133 return false;
134 }
135 }
136 return true;
137 }
138
139
140 public static boolean endsWithIgnoreCase(String s,String w)
141 {
142 if (w==null)
143 return true;
144
145 if (s==null)
146 return false;
147
148 int sl=s.length();
149 int wl=w.length();
150
151 if (sl<wl)
152 return false;
153
154 for (int i=wl;i-->0;)
155 {
156 char c1=s.charAt(--sl);
157 char c2=w.charAt(i);
158 if (c1!=c2)
159 {
160 if (c1<=127)
161 c1=lowercases[c1];
162 if (c2<=127)
163 c2=lowercases[c2];
164 if (c1!=c2)
165 return false;
166 }
167 }
168 return true;
169 }
170
171
172
173
174
175 public static int indexFrom(String s,String chars)
176 {
177 for (int i=0;i<s.length();i++)
178 if (chars.indexOf(s.charAt(i))>=0)
179 return i;
180 return -1;
181 }
182
183
184
185
186
187 public static String replace(String s, String sub, String with)
188 {
189 int c=0;
190 int i=s.indexOf(sub,c);
191 if (i == -1)
192 return s;
193
194 StringBuilder buf = new StringBuilder(s.length()+with.length());
195
196 do
197 {
198 buf.append(s.substring(c,i));
199 buf.append(with);
200 c=i+sub.length();
201 } while ((i=s.indexOf(sub,c))!=-1);
202
203 if (c<s.length())
204 buf.append(s.substring(c,s.length()));
205
206 return buf.toString();
207
208 }
209
210
211
212
213
214 public static String unquote(String s)
215 {
216 return QuotedStringTokenizer.unquote(s);
217 }
218
219
220
221
222
223
224
225
226
227 public static void append(StringBuilder buf,
228 String s,
229 int offset,
230 int length)
231 {
232 synchronized(buf)
233 {
234 int end=offset+length;
235 for (int i=offset; i<end;i++)
236 {
237 if (i>=s.length())
238 break;
239 buf.append(s.charAt(i));
240 }
241 }
242 }
243
244
245
246
247
248
249
250 public static void append(StringBuilder buf,byte b,int base)
251 {
252 int bi=0xff&b;
253 int c='0'+(bi/base)%base;
254 if (c>'9')
255 c= 'a'+(c-'0'-10);
256 buf.append((char)c);
257 c='0'+bi%base;
258 if (c>'9')
259 c= 'a'+(c-'0'-10);
260 buf.append((char)c);
261 }
262
263
264 public static void append2digits(StringBuffer buf,int i)
265 {
266 if (i<100)
267 {
268 buf.append((char)(i/10+'0'));
269 buf.append((char)(i%10+'0'));
270 }
271 }
272
273
274 public static void append2digits(StringBuilder buf,int i)
275 {
276 if (i<100)
277 {
278 buf.append((char)(i/10+'0'));
279 buf.append((char)(i%10+'0'));
280 }
281 }
282
283
284
285
286
287
288 public static String nonNull(String s)
289 {
290 if (s==null)
291 return "";
292 return s;
293 }
294
295
296 public static boolean equals(String s,char[] buf, int offset, int length)
297 {
298 if (s.length()!=length)
299 return false;
300 for (int i=0;i<length;i++)
301 if (buf[offset+i]!=s.charAt(i))
302 return false;
303 return true;
304 }
305
306
307 public static String toUTF8String(byte[] b,int offset,int length)
308 {
309 try
310 {
311 if (length<32)
312 {
313 Utf8StringBuffer buffer = new Utf8StringBuffer(length);
314 buffer.append(b,offset,length);
315 return buffer.toString();
316 }
317
318 return new String(b,offset,length,__UTF8);
319 }
320 catch (UnsupportedEncodingException e)
321 {
322 e.printStackTrace();
323 return null;
324 }
325 }
326
327
328 public static String toString(byte[] b,int offset,int length,String charset)
329 {
330 if (charset==null || StringUtil.isUTF8(charset))
331 return toUTF8String(b,offset,length);
332
333 try
334 {
335 return new String(b,offset,length,charset);
336 }
337 catch (UnsupportedEncodingException e)
338 {
339 e.printStackTrace();
340 return null;
341 }
342 }
343
344
345
346 public static boolean isUTF8(String charset)
347 {
348 return charset==__UTF8 || __UTF8.equalsIgnoreCase(charset);
349 }
350
351
352
353 public static String printable(String name)
354 {
355 if (name==null)
356 return null;
357 StringBuilder buf = new StringBuilder(name.length());
358 for (int i=0;i<name.length();i++)
359 {
360 char c=name.charAt(i);
361 if (!Character.isISOControl(c))
362 buf.append(c);
363 }
364 return buf.toString();
365 }
366
367
368 }