[java] 문자열에 ASCII 만 포함되어 있는지 확인하는 방법은 무엇입니까?

문자가 문자이면 호출이 Character.isLetter(c)반환 true됩니다. 그러나 StringASCII의 기본 문자 만 포함되어 있는지 빠르게 찾을 수있는 방법이 있습니까?



답변

에서 구아바 이후 19.0, 당신은 사용할 수 있습니다 :

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

이것은 현재 사용되지 않는 싱글 톤이 아닌 matchesAllOf(someString)팩토리 방법에 의존 하는 방법을 사용합니다 .ascii()ASCII

여기서 ASCII에는 탭, 줄 바꿈 / 반환과 같이 인쇄 할 수없는 문자 (공백)를 포함한 모든 ASCII 문자가 포함 되며 코드 및 코드도 포함 됩니다.0x20BEL0x07DEL0x7F

이 코드는 이전 버전의 주석에 코드 포인트가 표시되어 있어도 코드 포인트가 아닌 문자를 잘못 사용합니다. 다행히도 값이 U+010000이상인 코드 포인트를 만드는 데 필요한 문자는 ASCII 범위를 벗어난 값을 가진 두 개의 서로 게이트 문자를 사용합니다. 따라서이 메서드는 이모티콘이 포함 된 문자열에서도 ASCII 테스트에 성공합니다.

ascii()메서드가 없는 이전 Guava 버전의 경우 다음과 같이 작성할 수 있습니다.

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


답변

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 문자 감지


답변

여기에 라이브러리에 의존하지 않고 정규식을 사용하는 또 다른 방법이 있습니다.

다음 한 줄을 사용할 수 있습니다.

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


답변

문자열을 반복하고 모든 문자의 값이 128 미만인지 확인합니다.

Java 문자열은 개념적으로 UTF-16으로 인코딩됩니다. UTF-16에서 ASCII 문자 집합은 0-127 값으로 인코딩되며 ASCII가 아닌 문자 (하나 이상의 Java 문자로 구성 될 수 있음)에 대한 인코딩은 숫자 0-127을 포함하지 않도록 보장됩니다.


답변

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


답변

Apache의 commons-lang3에는이 문제를 포함한 모든 종류의 ‘문제’에 대한 유용한 유틸리티 / 편의 방법이 포함되어 있습니다.

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));


답변

이 시도:

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