• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.base;
18 
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 
22 import com.google.common.annotations.Beta;
23 import com.google.common.annotations.GwtCompatible;
24 
25 import javax.annotation.CheckReturnValue;
26 
27 /**
28  * Static methods pertaining to ASCII characters (those in the range of values
29  * {@code 0x00} through {@code 0x7F}), and to strings containing such
30  * characters.
31  *
32  * <p>ASCII utilities also exist in other classes of this package:
33  * <ul>
34  * <!-- TODO(kevinb): how can we make this not produce a warning when building gwt javadoc? -->
35  * <li>{@link Charsets#US_ASCII} specifies the {@code Charset} of ASCII characters.
36  * <li>{@link CharMatcher#ASCII} matches ASCII characters and provides text processing methods
37  *     which operate only on the ASCII characters of a string.
38  * </ul>
39  *
40  * @author Craig Berry
41  * @author Gregory Kick
42  * @since 7.0
43  */
44 @GwtCompatible
45 public final class Ascii {
46 
Ascii()47   private Ascii() {}
48 
49   /* The ASCII control characters, per RFC 20. */
50   /**
51    * Null ('\0'): The all-zeros character which may serve to accomplish
52    * time fill and media fill.  Normally used as a C string terminator.
53    * <p>Although RFC 20 names this as "Null", note that it is distinct
54    * from the C/C++ "NULL" pointer.
55    *
56    * @since 8.0
57    */
58   public static final byte NUL = 0;
59 
60   /**
61    * Start of Heading: A communication control character used at
62    * the beginning of a sequence of characters which constitute a
63    * machine-sensible address or routing information.  Such a sequence is
64    * referred to as the "heading."  An STX character has the effect of
65    * terminating a heading.
66    *
67    * @since 8.0
68    */
69   public static final byte SOH = 1;
70 
71   /**
72    * Start of Text: A communication control character which
73    * precedes a sequence of characters that is to be treated as an entity
74    * and entirely transmitted through to the ultimate destination.  Such a
75    * sequence is referred to as "text."  STX may be used to terminate a
76    * sequence of characters started by SOH.
77    *
78    * @since 8.0
79    */
80   public static final byte STX = 2;
81 
82   /**
83    * End of Text: A communication control character used to
84    * terminate a sequence of characters started with STX and transmitted
85    * as an entity.
86    *
87    * @since 8.0
88    */
89   public static final byte ETX = 3;
90 
91   /**
92    * End of Transmission: A communication control character used
93    * to indicate the conclusion of a transmission, which may have
94    * contained one or more texts and any associated headings.
95    *
96    * @since 8.0
97    */
98   public static final byte EOT = 4;
99 
100   /**
101    * Enquiry: A communication control character used in data
102    * communication systems as a request for a response from a remote
103    * station.  It may be used as a "Who Are You" (WRU) to obtain
104    * identification, or may be used to obtain station status, or both.
105    *
106    * @since 8.0
107    */
108   public static final byte ENQ = 5;
109 
110   /**
111    * Acknowledge: A communication control character transmitted
112    * by a receiver as an affirmative response to a sender.
113    *
114    * @since 8.0
115    */
116   public static final byte ACK = 6;
117 
118   /**
119    * Bell ('\a'): A character for use when there is a need to call for
120    * human attention.  It may control alarm or attention devices.
121    *
122    * @since 8.0
123    */
124   public static final byte BEL = 7;
125 
126   /**
127    * Backspace ('\b'): A format effector which controls the movement of
128    * the printing position one printing space backward on the same
129    * printing line.  (Applicable also to display devices.)
130    *
131    * @since 8.0
132    */
133   public static final byte BS = 8;
134 
135   /**
136    * Horizontal Tabulation ('\t'): A format effector which controls the
137    * movement of the printing position to the next in a series of
138    * predetermined positions along the printing line.  (Applicable also to
139    * display devices and the skip function on punched cards.)
140    *
141    * @since 8.0
142    */
143   public static final byte HT = 9;
144 
145   /**
146    * Line Feed ('\n'): A format effector which controls the movement of
147    * the printing position to the next printing line.  (Applicable also to
148    * display devices.) Where appropriate, this character may have the
149    * meaning "New Line" (NL), a format effector which controls the
150    * movement of the printing point to the first printing position on the
151    * next printing line.  Use of this convention requires agreement
152    * between sender and recipient of data.
153    *
154    * @since 8.0
155    */
156   public static final byte LF = 10;
157 
158   /**
159    * Alternate name for {@link #LF}.  ({@code LF} is preferred.)
160    *
161    * @since 8.0
162    */
163   public static final byte NL = 10;
164 
165   /**
166    * Vertical Tabulation ('\v'): A format effector which controls the
167    * movement of the printing position to the next in a series of
168    * predetermined printing lines.  (Applicable also to display devices.)
169    *
170    * @since 8.0
171    */
172   public static final byte VT = 11;
173 
174   /**
175    * Form Feed ('\f'): A format effector which controls the movement of
176    * the printing position to the first pre-determined printing line on
177    * the next form or page.  (Applicable also to display devices.)
178    *
179    * @since 8.0
180    */
181   public static final byte FF = 12;
182 
183   /**
184    * Carriage Return ('\r'): A format effector which controls the
185    * movement of the printing position to the first printing position on
186    * the same printing line.  (Applicable also to display devices.)
187    *
188    * @since 8.0
189    */
190   public static final byte CR = 13;
191 
192   /**
193    * Shift Out: A control character indicating that the code
194    * combinations which follow shall be interpreted as outside of the
195    * character set of the standard code table until a Shift In character
196    * is reached.
197    *
198    * @since 8.0
199    */
200   public static final byte SO = 14;
201 
202   /**
203    * Shift In: A control character indicating that the code
204    * combinations which follow shall be interpreted according to the
205    * standard code table.
206    *
207    * @since 8.0
208    */
209   public static final byte SI = 15;
210 
211   /**
212    * Data Link Escape: A communication control character which
213    * will change the meaning of a limited number of contiguously following
214    * characters.  It is used exclusively to provide supplementary controls
215    * in data communication networks.
216    *
217    * @since 8.0
218    */
219   public static final byte DLE = 16;
220 
221   /**
222    * Device Control 1. Characters for the control
223    * of ancillary devices associated with data processing or
224    * telecommunication systems, more especially switching devices "on" or
225    * "off."  (If a single "stop" control is required to interrupt or turn
226    * off ancillary devices, DC4 is the preferred assignment.)
227    *
228    * @since 8.0
229    */
230   public static final byte DC1 = 17; // aka XON
231 
232   /**
233    * Transmission On: Although originally defined as DC1, this ASCII
234    * control character is now better known as the XON code used for software
235    * flow control in serial communications.  The main use is restarting
236    * the transmission after the communication has been stopped by the XOFF
237    * control code.
238    *
239    * @since 8.0
240    */
241   public static final byte XON = 17; // aka DC1
242 
243   /**
244    * Device Control 2. Characters for the control
245    * of ancillary devices associated with data processing or
246    * telecommunication systems, more especially switching devices "on" or
247    * "off."  (If a single "stop" control is required to interrupt or turn
248    * off ancillary devices, DC4 is the preferred assignment.)
249    *
250    * @since 8.0
251    */
252   public static final byte DC2 = 18;
253 
254   /**
255    * Device Control 3. Characters for the control
256    * of ancillary devices associated with data processing or
257    * telecommunication systems, more especially switching devices "on" or
258    * "off."  (If a single "stop" control is required to interrupt or turn
259    * off ancillary devices, DC4 is the preferred assignment.)
260    *
261    * @since 8.0
262    */
263   public static final byte DC3 = 19; // aka XOFF
264 
265   /**
266    * Transmission off. See {@link #XON} for explanation.
267    *
268    * @since 8.0
269    */
270   public static final byte XOFF = 19; // aka DC3
271 
272   /**
273    * Device Control 4. Characters for the control
274    * of ancillary devices associated with data processing or
275    * telecommunication systems, more especially switching devices "on" or
276    * "off."  (If a single "stop" control is required to interrupt or turn
277    * off ancillary devices, DC4 is the preferred assignment.)
278    *
279    * @since 8.0
280    */
281   public static final byte DC4 = 20;
282 
283   /**
284    * Negative Acknowledge: A communication control character
285    * transmitted by a receiver as a negative response to the sender.
286    *
287    * @since 8.0
288    */
289   public static final byte NAK = 21;
290 
291   /**
292    * Synchronous Idle: A communication control character used by
293    * a synchronous transmission system in the absence of any other
294    * character to provide a signal from which synchronism may be achieved
295    * or retained.
296    *
297    * @since 8.0
298    */
299   public static final byte SYN = 22;
300 
301   /**
302    * End of Transmission Block: A communication control character
303    * used to indicate the end of a block of data for communication
304    * purposes.  ETB is used for blocking data where the block structure is
305    * not necessarily related to the processing format.
306    *
307    * @since 8.0
308    */
309   public static final byte ETB = 23;
310 
311   /**
312    * Cancel: A control character used to indicate that the data
313    * with which it is sent is in error or is to be disregarded.
314    *
315    * @since 8.0
316    */
317   public static final byte CAN = 24;
318 
319   /**
320    * End of Medium: A control character associated with the sent
321    * data which may be used to identify the physical end of the medium, or
322    * the end of the used, or wanted, portion of information recorded on a
323    * medium.  (The position of this character does not necessarily
324    * correspond to the physical end of the medium.)
325    *
326    * @since 8.0
327    */
328   public static final byte EM = 25;
329 
330   /**
331    * Substitute: A character that may be substituted for a
332    * character which is determined to be invalid or in error.
333    *
334    * @since 8.0
335    */
336   public static final byte SUB = 26;
337 
338   /**
339    * Escape: A control character intended to provide code
340    * extension (supplementary characters) in general information
341    * interchange.  The Escape character itself is a prefix affecting the
342    * interpretation of a limited number of contiguously following
343    * characters.
344    *
345    * @since 8.0
346    */
347   public static final byte ESC = 27;
348 
349   /**
350    * File Separator: These four information separators may be
351    * used within data in optional fashion, except that their hierarchical
352    * relationship shall be: FS is the most inclusive, then GS, then RS,
353    * and US is least inclusive.  (The content and length of a File, Group,
354    * Record, or Unit are not specified.)
355    *
356    * @since 8.0
357    */
358   public static final byte FS = 28;
359 
360   /**
361    * Group Separator: These four information separators may be
362    * used within data in optional fashion, except that their hierarchical
363    * relationship shall be: FS is the most inclusive, then GS, then RS,
364    * and US is least inclusive.  (The content and length of a File, Group,
365    * Record, or Unit are not specified.)
366    *
367    * @since 8.0
368    */
369   public static final byte GS = 29;
370 
371   /**
372    * Record Separator: These four information separators may be
373    * used within data in optional fashion, except that their hierarchical
374    * relationship shall be: FS is the most inclusive, then GS, then RS,
375    * and US is least inclusive.  (The content and length of a File, Group,
376    * Record, or Unit are not specified.)
377    *
378    * @since 8.0
379    */
380   public static final byte RS = 30;
381 
382   /**
383    * Unit Separator: These four information separators may be
384    * used within data in optional fashion, except that their hierarchical
385    * relationship shall be: FS is the most inclusive, then GS, then RS,
386    * and US is least inclusive.  (The content and length of a File, Group,
387    * Record, or Unit are not specified.)
388    *
389    * @since 8.0
390    */
391   public static final byte US = 31;
392 
393   /**
394    * Space: A normally non-printing graphic character used to
395    * separate words.  It is also a format effector which controls the
396    * movement of the printing position, one printing position forward.
397    * (Applicable also to display devices.)
398    *
399    * @since 8.0
400    */
401   public static final byte SP = 32;
402 
403   /**
404    * Alternate name for {@link #SP}.
405    *
406    * @since 8.0
407    */
408   public static final byte SPACE = 32;
409 
410   /**
411    * Delete: This character is used primarily to "erase" or
412    * "obliterate" erroneous or unwanted characters in perforated tape.
413    *
414    * @since 8.0
415    */
416   public static final byte DEL = 127;
417 
418   /**
419    * The minimum value of an ASCII character.
420    *
421    * @since 9.0 (was type {@code int} before 12.0)
422    */
423   public static final char MIN = 0;
424 
425   /**
426    * The maximum value of an ASCII character.
427    *
428    * @since 9.0 (was type {@code int} before 12.0)
429    */
430   public static final char MAX = 127;
431 
432   /**
433    * Returns a copy of the input string in which all {@linkplain #isUpperCase(char) uppercase ASCII
434    * characters} have been converted to lowercase. All other characters are copied without
435    * modification.
436    */
toLowerCase(String string)437   public static String toLowerCase(String string) {
438     int length = string.length();
439     for (int i = 0; i < length; i++) {
440       if (isUpperCase(string.charAt(i))) {
441         char[] chars = string.toCharArray();
442         for (; i < length; i++) {
443           char c = chars[i];
444           if (isUpperCase(c)) {
445             chars[i] = (char) (c ^ 0x20);
446           }
447         }
448         return String.valueOf(chars);
449       }
450     }
451     return string;
452   }
453 
454   /**
455    * Returns a copy of the input character sequence in which all {@linkplain #isUpperCase(char)
456    * uppercase ASCII characters} have been converted to lowercase. All other characters are copied
457    * without modification.
458    *
459    * @since 14.0
460    */
toLowerCase(CharSequence chars)461   public static String toLowerCase(CharSequence chars) {
462     if (chars instanceof String) {
463       return toLowerCase((String) chars);
464     }
465     int length = chars.length();
466     StringBuilder builder = new StringBuilder(length);
467     for (int i = 0; i < length; i++) {
468       builder.append(toLowerCase(chars.charAt(i)));
469     }
470     return builder.toString();
471   }
472 
473   /**
474    * If the argument is an {@linkplain #isUpperCase(char) uppercase ASCII character} returns the
475    * lowercase equivalent. Otherwise returns the argument.
476    */
toLowerCase(char c)477   public static char toLowerCase(char c) {
478     return isUpperCase(c) ? (char) (c ^ 0x20) : c;
479   }
480 
481   /**
482    * Returns a copy of the input string in which all {@linkplain #isLowerCase(char) lowercase ASCII
483    * characters} have been converted to uppercase. All other characters are copied without
484    * modification.
485    */
toUpperCase(String string)486   public static String toUpperCase(String string) {
487     int length = string.length();
488     for (int i = 0; i < length; i++) {
489       if (isLowerCase(string.charAt(i))) {
490         char[] chars = string.toCharArray();
491         for (; i < length; i++) {
492           char c = chars[i];
493           if (isLowerCase(c)) {
494             chars[i] = (char) (c & 0x5f);
495           }
496         }
497         return String.valueOf(chars);
498       }
499     }
500     return string;
501   }
502 
503   /**
504    * Returns a copy of the input character sequence in which all {@linkplain #isLowerCase(char)
505    * lowercase ASCII characters} have been converted to uppercase. All other characters are copied
506    * without modification.
507    *
508    * @since 14.0
509    */
toUpperCase(CharSequence chars)510   public static String toUpperCase(CharSequence chars) {
511     if (chars instanceof String) {
512       return toUpperCase((String) chars);
513     }
514     int length = chars.length();
515     StringBuilder builder = new StringBuilder(length);
516     for (int i = 0; i < length; i++) {
517       builder.append(toUpperCase(chars.charAt(i)));
518     }
519     return builder.toString();
520   }
521 
522   /**
523    * If the argument is a {@linkplain #isLowerCase(char) lowercase ASCII character} returns the
524    * uppercase equivalent. Otherwise returns the argument.
525    */
toUpperCase(char c)526   public static char toUpperCase(char c) {
527     return isLowerCase(c) ? (char) (c & 0x5f) : c;
528   }
529 
530   /**
531    * Indicates whether {@code c} is one of the twenty-six lowercase ASCII alphabetic characters
532    * between {@code 'a'} and {@code 'z'} inclusive. All others (including non-ASCII characters)
533    * return {@code false}.
534    */
isLowerCase(char c)535   public static boolean isLowerCase(char c) {
536     // Note: This was benchmarked against the alternate expression "(char)(c - 'a') < 26" (Nov '13)
537     // and found to perform at least as well, or better.
538     return (c >= 'a') && (c <= 'z');
539   }
540 
541   /**
542    * Indicates whether {@code c} is one of the twenty-six uppercase ASCII alphabetic characters
543    * between {@code 'A'} and {@code 'Z'} inclusive. All others (including non-ASCII characters)
544    * return {@code false}.
545    */
isUpperCase(char c)546   public static boolean isUpperCase(char c) {
547     return (c >= 'A') && (c <= 'Z');
548   }
549 
550   /**
551    * Truncates the given character sequence to the given maximum length. If the length of the
552    * sequence is greater than {@code maxLength}, the returned string will be exactly
553    * {@code maxLength} chars in length and will end with the given {@code truncationIndicator}.
554    * Otherwise, the sequence will be returned as a string with no changes to the content.
555    *
556    * <p>Examples:
557    *
558    * <pre>   {@code
559    *   Ascii.truncate("foobar", 7, "..."); // returns "foobar"
560    *   Ascii.truncate("foobar", 5, "..."); // returns "fo..." }</pre>
561    *
562    * <p><b>Note:</b> This method <i>may</i> work with certain non-ASCII text but is not safe for
563    * use with arbitrary Unicode text. It is mostly intended for use with text that is known to be
564    * safe for use with it (such as all-ASCII text) and for simple debugging text. When using this
565    * method, consider the following:
566    *
567    * <ul>
568    *   <li>it may split surrogate pairs</li>
569    *   <li>it may split characters and combining characters</li>
570    *   <li>it does not consider word boundaries</li>
571    *   <li>if truncating for display to users, there are other considerations that must be taken
572    *   into account</li>
573    *   <li>the appropriate truncation indicator may be locale-dependent</li>
574    *   <li>it is safe to use non-ASCII characters in the truncation indicator</li>
575    * </ul>
576    *
577    *
578    * @throws IllegalArgumentException if {@code maxLength} is less than the length of
579    *     {@code truncationIndicator}
580    * @since 16.0
581    */
582   @Beta
583   @CheckReturnValue
truncate(CharSequence seq, int maxLength, String truncationIndicator)584   public static String truncate(CharSequence seq, int maxLength, String truncationIndicator) {
585     checkNotNull(seq);
586 
587     // length to truncate the sequence to, not including the truncation indicator
588     int truncationLength = maxLength - truncationIndicator.length();
589 
590     // in this worst case, this allows a maxLength equal to the length of the truncationIndicator,
591     // meaning that a string will be truncated to just the truncation indicator itself
592     checkArgument(truncationLength >= 0,
593         "maxLength (%s) must be >= length of the truncation indicator (%s)",
594         maxLength, truncationIndicator.length());
595 
596     if (seq.length() <= maxLength) {
597       String string = seq.toString();
598       if (string.length() <= maxLength) {
599         return string;
600       }
601       // if the length of the toString() result was > maxLength for some reason, truncate that
602       seq = string;
603     }
604 
605     return new StringBuilder(maxLength)
606         .append(seq, 0, truncationLength)
607         .append(truncationIndicator)
608         .toString();
609   }
610 
611   /**
612    * Indicates whether the contents of the given character sequences {@code s1} and {@code s2} are
613    * equal, ignoring the case of any ASCII alphabetic characters between {@code 'a'} and {@code 'z'}
614    * or {@code 'A'} and {@code 'Z'} inclusive.
615    *
616    * <p>This method is significantly faster than {@link String#equalsIgnoreCase} and should be used
617    * in preference if at least one of the parameters is known to contain only ASCII characters.
618    *
619    * <p>Note however that this method does not always behave identically to expressions such as:
620    * <ul>
621    * <li>{@code string.toUpperCase().equals("UPPER CASE ASCII")}
622    * <li>{@code string.toLowerCase().equals("lower case ascii")}
623    * </ul>
624    * <p>due to case-folding of some non-ASCII characters (which does not occur in
625    * {@link String#equalsIgnoreCase}). However in almost all cases that ASCII strings are used,
626    * the author probably wanted the behavior provided by this method rather than the subtle and
627    * sometimes surprising behavior of {@code toUpperCase()} and {@code toLowerCase()}.
628    *
629    * @since 16.0
630    */
631   @Beta
equalsIgnoreCase(CharSequence s1, CharSequence s2)632   public static boolean equalsIgnoreCase(CharSequence s1, CharSequence s2) {
633     // Calling length() is the null pointer check (so do it before we can exit early).
634     int length = s1.length();
635     if (s1 == s2) {
636       return true;
637     }
638     if (length != s2.length()) {
639       return false;
640     }
641     for (int i = 0; i < length; i++) {
642       char c1 = s1.charAt(i);
643       char c2 = s2.charAt(i);
644       if (c1 == c2) {
645         continue;
646       }
647       int alphaIndex = getAlphaIndex(c1);
648       // This was also benchmarked using '&' to avoid branching (but always evaluate the rhs),
649       // however this showed no obvious improvement.
650       if (alphaIndex < 26 && alphaIndex == getAlphaIndex(c2)) {
651         continue;
652       }
653       return false;
654     }
655     return true;
656   }
657 
658   /**
659    * Returns the non-negative index value of the alpha character {@code c}, regardless of case.
660    * Ie, 'a'/'A' returns 0 and 'z'/'Z' returns 25. Non-alpha characters return a value of 26 or
661    * greater.
662    */
getAlphaIndex(char c)663   private static int getAlphaIndex(char c) {
664     // Fold upper-case ASCII to lower-case and make zero-indexed and unsigned (by casting to char).
665     return (char) ((c | 0x20) - 'a');
666   }
667 }
668