Можно ли проверить, содержит ли строка только ASCII?

Вызов Character.isLetter(c) возвращает true если символ является буквой. Но есть ли способ быстро найти, если String содержит только базовые символы ASCII?

Ответ 1

Начиная с Guava 19.0, вы можете использовать:

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

При этом используется метод matchesAllOf(someString) который основан на заводском методе ascii() а не на устаревшем matchesAllOf(someString) ASCII.

Здесь ASCII включает в себя все символы ASCII, включая непечатаемые символы меньше 0x20 (пробел), такие как табуляция, перевод строки/возврат, а также BEL с кодом 0x07 и DEL с кодом 0x7F.

Этот код неправильно использует символы, а не кодовые точки, даже если кодовые точки указаны в комментариях более ранних версий. К счастью, символы, необходимые для создания кодовой точки со значением U+010000 или более, используют два суррогатных символа со значением вне диапазона ASCII. Таким образом, метод все еще успешно тестирует ASCII, даже для строк, содержащих эмодзи.

Для более ранних версий Guava без метода ascii() вы можете написать:

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

Ответ 2

Вы можете сделать это с помощью java.nio.charset.Charset.

import java.nio.charset.Charset;

public class StringUtils {

  public static boolean isPureAscii(String v) {
    return Charset.forName("US-ASCII").newEncoder().canEncode(v);
    // or "ISO-8859-1" for ISO Latin 1
    // or StandardCharsets.US_ASCII with JDK1.7+
  }

  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
      */
  }
}

Обнаружить не-ASCII символ в строке

Ответ 3

Вот еще один способ, не зависящий от библиотеки, но использующий регулярное выражение.

Вы можете использовать эту единственную строку:

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

Целая программа:

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"));
    }
}

Ответ 4

Итерации по строке и убедитесь, что все символы имеют значение меньше 128.

Строки Java концептуально кодируются как UTF-16. В UTF-16 набор символов ASCII кодируется как значения 0 - 127, а кодировка для любого символа без символа ASCII (который может состоять из более чем одного Java char) гарантированно не включает числа 0 - 127

Ответ 5

Или вы скопируете код из класса 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;
}

Ответ 6

commons-lang3 из Apache содержит ценные утилиты/методы удобства для всех видов "проблем", включая этот.

System.out.println(StringUtils.isAsciiPrintable("[email protected]£$%^&[email protected]£$%^"));

Ответ 7

попробуйте следующее:

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

Ответ 8

Перейдите через строку и используйте charAt(), чтобы получить char. Затем рассмотрите его как int и посмотрите, имеет ли он значение unicode (надмножество ASCII), которое вам нравится.

Перерыв при первом не нравится.

Ответ 9

private static boolean isASCII(String s) 
{
    for (int i = 0; i < s.length(); i++) 
        if (s.charAt(i) > 127) 
            return false;
    return true;
}

Ответ 10

Это было возможно. Довольно проблема.

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

Ответ 11

Это вернет true, если String содержит только символы ASCII, и false, если нет

Charset.forName("US-ASCII").newEncoder().canEncode(str)

Если вы хотите удалить не ASCII, вот фрагмент:

if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
                        str = str.replaceAll("[^\\p{ASCII}]", "");
                    }

Ответ 12

//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
  return (c > 64 && c < 91) || (c > 96 && c < 123);
}