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