2010-08-27 12 views
90

Character.isLetter (c) restituisce true se il carattere è una lettera. Ma c'è un modo per trovare rapidamente se una stringa contiene solo i caratteri di base di ASCII?In Java, è possibile verificare se una stringa è solo ASCII?

+1

Si prega di accettare la risposta di jeremyp come è non richiede dipendenze, e non epicamente codice verbose, e illumina la definizione e la storia di caratteri ASCII. – samthebest

risposta

105

Utilizzando Guava, si può solo scrivere:

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

Da Guava 19,0 in poi, si dovrebbe usare CharMatcher.ascii() invece.

+5

Ah, le meraviglie dei livelli di astrazione :) –

+0

Nice one Colin. –

+27

+1 Anche se va bene se non hai bisogno di un'altra libreria di terze parti, la risposta di Colin è molto più breve e molto più leggibile. Suggerire librerie di terze parti è perfettamente OK e non dovrebbe essere punito con un voto negativo. – Jesper

3

Iterate attraverso la stringa e utilizzate charAt() per ottenere il carattere. Quindi trattalo come un int, e vedi se ha un valore unicode (un superset di ASCII) che ti piace.

Pausa al primo che non ti piace.

82

È possibile farlo 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

Non credo che sia una buona idea per fare il CharsetEncoder statica poiché, secondo la documentazione "istanze di questa classe non sono sicuri per l'uso da parte multipla concomitante fili ". –

+0

@paul_sns, si sono CharsetEncoder diritto non è thread-safe (ma charset è) quindi non è una buona idea per renderlo statico. – RealHowTo

+5

con Java 1.7 o superiore si può usare 'StandardCharsets.US_ASCII' invece di' Charset.forName ("US-ASCII") '. –

62

Ecco un altro modo, non a seconda di una biblioteca, ma utilizzando un'espressione regolare.

È possibile utilizzare questa singola riga:

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

programma di esempio totale:

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

Sarebbe meraviglioso se spiegassi questa espressione regolare. –

+11

\\ A - Inizio di ingresso ... \\ p {ASCII} * - Qualsiasi carattere ASCII eventuali tempi ... \\ z - Fine di ingresso – Arne

44

Itera attraverso la stringa e assicurarsi che tutti i personaggi hanno un valore inferiore a 128.

Le stringhe Java sono concettualmente codificate come UTF-16. In UTF-16, il set di caratteri ASCII è codificato come i valori 0 - 127 e la codifica per qualsiasi carattere non ASCII (che può consistere di più di un carattere Java) è garantita per non includere i numeri 0 - 127

+3

Questo dovrebbe essere la risposta superiore. Controlla se è <128, semplice. –

+14

con Java 1.8 si può fare: 'str.chars() allmatch (c -> c <128)' –

+4

Se si desidera che i caratteri stampabili si consiglia di verificare 'c> = 0x20 && c <0x7F' come il primo. 32 valori della codifica a 7 bit sono caratteri di controllo e il valore finale (0x7F) è 'DEL'. –

14

O si copia il codice dalla classe 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

Questo funziona anche con 2-char-unicode, perché il 1 °-char è> = U + D800 – k3b

4

provare questo:

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

Era possibile. Bel 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 da Apache contiene metodi di utilità/convenienza di valore per tutti i tipi di 'problemi', compreso questo.

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; 
} 
Problemi correlati