Можно ли проверить, содержит ли строка только ASCII? - PullRequest
106 голосов
/ 27 августа 2010

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

Ответы [ 12 ]

117 голосов
/ 27 августа 2010

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

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

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

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

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

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

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
96 голосов
/ 27 августа 2010

Это можно сделать с помощью 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 символа в строке

72 голосов
/ 27 августа 2010

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

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

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"));
    }
}
52 голосов
/ 27 августа 2010

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

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

14 голосов
/ 28 декабря 2012

Или вы копируете код из 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;
}
9 голосов
/ 13 июля 2015

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

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
4 голосов
/ 29 октября 2013

попробуйте это:

for (char c: string.toCharArray()){
  if (((int)c)>127){
    return false;
  } 
}
return true;
2 голосов
/ 27 августа 2010

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

1 голос
/ 26 сентября 2016
private static boolean isASCII(String s) 
{
    for (int i = 0; i < s.length(); i++) 
        if (s.charAt(i) > 127) 
            return false;
    return true;
}
0 голосов
/ 13 июня 2019

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

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

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

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