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

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

108
задан Maarten Bodewes 13 November 2018 в 18:04
поделиться

5 ответов

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

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

Здесь используется метод matchAllOf(someString) , который опирается на фабричный метод . ] ascii() вместо устаревшего ASCII синглтона.

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

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

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

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
120
ответ дан 24 November 2019 в 03:25
поделиться

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

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

.
54
ответ дан 24 November 2019 в 03:25
поделиться

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

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

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"));
    }
}
73
ответ дан 24 November 2019 в 03:25
поделиться

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

Разбейте первое, что вам не нравится.

1
ответ дан 24 November 2019 в 03:25
поделиться

Вы можете сделать это с помощью 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, в строке

98
ответ дан 24 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: