2010-08-27 17 views
90

Character.isLetter (c) devuelve verdadero si el carácter es una letra. ¿Pero hay una manera de encontrar rápidamente si una Cadena solo contiene los caracteres base de ASCII?En Java, ¿es posible verificar si una Cadena es solo ASCII?

+1

Por favor acepte la respuesta de jeremyP ya que es no requiere dependencias, y ningún epically código detallado, e ilumina la propia definición y la historia de caracteres ASCII. – samthebest

Respuesta

105

Usando Guava, usted podría escribir:

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString); 

De Guayaba 19.0, usted debe utilizar CharMatcher.ascii() lugar.

+5

Ah, las maravillas de las capas de abstracción :) –

+0

Nice one Colin. –

+27

+1 Aunque es bueno si no necesita otra biblioteca de terceros, la respuesta de Colin es mucho más corta y mucho más legible. Sugerir bibliotecas de terceros está perfectamente bien y no debería castigarse con un voto negativo. – Jesper

3

Iterate a través de la cadena y usa charAt() para obtener el carácter. Luego trátela como un int, y vea si tiene un valor unicode (un superconjunto de ASCII) que le guste.

Romper en el primero que no te gusta.

82

Puede hacerlo con java.nio.charset.Charset.

import java.nio.charset.Charset; 
import java.nio.charset.CharsetEncoder; 

public class StringUtils { 

    static CharsetEncoder asciiEncoder = 
     Charset.forName("US-ASCII").newEncoder(); // or "ISO-8859-1" for ISO Latin 1 

    public static boolean isPureAscii(String v) { 
    return asciiEncoder.canEncode(v); 
    } 

    public static void main (String args[]) 
    throws Exception { 

    String test = "Réal"; 
    System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test)); 
    test = "Real"; 
    System.out.println(test + " isPureAscii() : " + StringUtils.isPureAscii(test)); 

    /* 
     * output : 
     * Réal isPureAscii() : false 
     * Real isPureAscii() : true 
     */ 
    } 
} 

Detect non-ASCII character in a String

+8

No creo que sea una buena idea hacer el CharsetEncoder estático ya que de acuerdo con los documentos" Las instancias de esta clase no son seguras para el uso simultáneo múltiple trapos." –

+0

@paul_sns, tiene razón CharsetEncoder no es seguro para subprocesos (pero Charset lo es) por lo que no es una buena idea hacerlo estático. – RealHowTo

+5

Con Java 1.7 o superior se puede usar 'StandardCharsets.US_ASCII' en lugar de' Charset.forName ("US-ASCII") '. –

62

Aquí es otra forma que no depende de una biblioteca, pero utilizando una expresión regular.

Puede utilizar esta sola línea:

text.matches("\\A\\p{ASCII}*\\z") 

entero programa de ejemplo:

public class Main { 
    public static void main(String[] args) { 
     char nonAscii = 0x00FF; 
     String asciiText = "Hello"; 
     String nonAsciiText = "Buy: " + nonAscii; 
     System.out.println(asciiText.matches("\\A\\p{ASCII}*\\z")); 
     System.out.println(nonAsciiText.matches("\\A\\p{ASCII}*\\z")); 
    } 
} 
+2

Sería maravilloso si explicas esta expresión regular. –

+11

\\ A - Inicio de la entrada ... \\ p {ASCII} * - Cualquier carácter ASCII en cualquier momento ... \\ z - Fin de la entrada – Arne

44

iterar a través de la cadena y asegurarse de que todos los personajes tienen un valor inferior a 128.

Java Strings está conceptualmente codificado como UTF-16. En UTF-16, el juego de caracteres ASCII se codifica como los valores 0 - 127 y la codificación para cualquier carácter no ASCII (que puede consistir en más de un carácter Java) garantiza que no incluya los números 0 - 127

+3

Esta debería ser la respuesta principal. Solo verifica si es <128, simple. –

+14

Con Java 1.8 puede hacer: 'str.chars(). AllMatch (c -> c <128)' –

+4

Si desea caracteres imprimibles, puede probar para 'c> = 0x20 && c <0x7F' como la primera 32 valores de la codificación de 7 bits son caracteres de control y el valor final (0x7F) es 'DEL'. –

14

O copia el código de la clase IDN.

// to check if a string only contains US-ASCII code point 
// 
private static boolean isAllASCII(String input) { 
    boolean isASCII = true; 
    for (int i = 0; i < input.length(); i++) { 
     int c = input.charAt(i); 
     if (c > 0x7F) { 
      isASCII = false; 
      break; 
     } 
    } 
    return isASCII; 
} 
+1

Esto incluso funciona con 2-char-unicode porque el primer char es> = U + D800 – k3b

4

probar esto:

for (char c: string.toCharArray()){ 
    if (((int)c)>127){ 
    return false; 
    } 
} 
return true; 
0

Era posible. Buen problema.

import java.io.UnsupportedEncodingException; 
import java.nio.charset.Charset; 
import java.nio.charset.CharsetEncoder; 

public class EncodingTest { 

    static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII") 
      .newEncoder(); 

    public static void main(String[] args) { 

     String testStr = "¤EÀsÆW°ê»Ú®i¶T¤¤¤ß3¼Ó®i¶TÆU2~~KITEC 3/F Rotunda 2"; 
     String[] strArr = testStr.split("~~", 2); 
     int count = 0; 
     boolean encodeFlag = false; 

     do { 
      encodeFlag = asciiEncoderTest(strArr[count]); 
      System.out.println(encodeFlag); 
      count++; 
     } while (count < strArr.length); 
    } 

    public static boolean asciiEncoderTest(String test) { 
     boolean encodeFlag = false; 
     try { 
      encodeFlag = asciiEncoder.canEncode(new String(test 
        .getBytes("ISO8859_1"), "BIG5")); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     return encodeFlag; 
    } 
} 
-1
//return is uppercase or lowercase 
public boolean isASCIILetter(char c) { 
    return (c > 64 && c < 91) || (c > 96 && c < 123); 
} 
5

Commons-lang3 de Apache contiene métodos de utilidad/conveniencia valiosos para todo tipo de 'problemas', incluido éste.

System.out.println(StringUtils.isAsciiPrintable("[email protected]£$%^&[email protected]£$%^")); 
1
private static boolean isASCII(String s) 
{ 
    for (int i = 0; i < s.length(); i++) 
     if (s.charAt(i) > 127) 
      return false; 
    return true; 
} 
Cuestiones relacionadas