001/*
002 * Copyright (C) 2010 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package com.google.common.base;
018
019import static com.google.common.base.Preconditions.checkArgument;
020import static com.google.common.base.Preconditions.checkNotNull;
021
022import com.google.common.annotations.Beta;
023import com.google.common.annotations.GwtCompatible;
024
025import javax.annotation.CheckReturnValue;
026
027/**
028 * Static methods pertaining to ASCII characters (those in the range of values
029 * {@code 0x00} through {@code 0x7F}), and to strings containing such
030 * characters.
031 *
032 * <p>ASCII utilities also exist in other classes of this package:
033 * <ul>
034 * <!-- TODO(kevinb): how can we make this not produce a warning when building gwt javadoc? -->
035 * <li>{@link Charsets#US_ASCII} specifies the {@code Charset} of ASCII characters.
036 * <li>{@link CharMatcher#ASCII} matches ASCII characters and provides text processing methods
037 *     which operate only on the ASCII characters of a string.
038 * </ul>
039 *
040 * @author Craig Berry
041 * @author Gregory Kick
042 * @since 7.0
043 */
044@GwtCompatible
045public final class Ascii {
046
047  private Ascii() {}
048
049  /* The ASCII control characters, per RFC 20. */
050  /**
051   * Null ('\0'): The all-zeros character which may serve to accomplish
052   * time fill and media fill.  Normally used as a C string terminator.
053   * <p>Although RFC 20 names this as "Null", note that it is distinct
054   * from the C/C++ "NULL" pointer.
055   *
056   * @since 8.0
057   */
058  public static final byte NUL = 0;
059
060  /**
061   * Start of Heading: A communication control character used at
062   * the beginning of a sequence of characters which constitute a
063   * machine-sensible address or routing information.  Such a sequence is
064   * referred to as the "heading."  An STX character has the effect of
065   * terminating a heading.
066   *
067   * @since 8.0
068   */
069  public static final byte SOH = 1;
070
071  /**
072   * Start of Text: A communication control character which
073   * precedes a sequence of characters that is to be treated as an entity
074   * and entirely transmitted through to the ultimate destination.  Such a
075   * sequence is referred to as "text."  STX may be used to terminate a
076   * sequence of characters started by SOH.
077   *
078   * @since 8.0
079   */
080  public static final byte STX = 2;
081
082  /**
083   * End of Text: A communication control character used to
084   * terminate a sequence of characters started with STX and transmitted
085   * as an entity.
086   *
087   * @since 8.0
088   */
089  public static final byte ETX = 3;
090
091  /**
092   * End of Transmission: A communication control character used
093   * to indicate the conclusion of a transmission, which may have
094   * contained one or more texts and any associated headings.
095   *
096   * @since 8.0
097   */
098  public static final byte EOT = 4;
099
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   */
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   */
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   */
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   */
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   */
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   */
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   */
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   */
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
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
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   */
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}