답변:
에서 구아바 이후 19.0, 당신은 사용할 수 있습니다 :
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
이것은 현재 사용되지 않는 싱글 톤이 아닌 matchesAllOf(someString)
팩토리 방법에 의존 하는 방법을 사용합니다 .ascii()
ASCII
여기서 ASCII에는 탭, 줄 바꿈 / 반환과 같이 인쇄 할 수없는 문자 (공백)를 포함한 모든 ASCII 문자가 포함 되며 코드 및 코드도 포함 됩니다.0x20
BEL
0x07
DEL
0x7F
이 코드는 이전 버전의 주석에 코드 포인트가 표시되어 있어도 코드 포인트가 아닌 문자를 잘못 사용합니다. 다행히도 값이 U+010000
이상인 코드 포인트를 만드는 데 필요한 문자는 ASCII 범위를 벗어난 값을 가진 두 개의 서로 게이트 문자를 사용합니다. 따라서이 메서드는 이모티콘이 포함 된 문자열에서도 ASCII 테스트에 성공합니다.
ascii()
메서드가 없는 이전 Guava 버전의 경우 다음과 같이 작성할 수 있습니다.
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
는 현재 사용되지 않으며 2018 년 6 월에 제거 될 예정입니다.
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
*/
}
}
StandardCharsets.US_ASCII
에서는 Charset.forName("US-ASCII")
.
StandardCharsets
? 다른 답변을 게시 할 수는 있지만이 고맙게도 대답을 수정하고 싶습니다.
여기에 라이브러리에 의존하지 않고 정규식을 사용하는 또 다른 방법이 있습니다.
다음 한 줄을 사용할 수 있습니다.
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"));
}
}
\P{Print}
및 \P{Graph}
설명을 포함해도 될까요? 당신은 왜 필요합니까 \A
와 \z
?
문자열을 반복하고 모든 문자의 값이 128 미만인지 확인합니다.
Java 문자열은 개념적으로 UTF-16으로 인코딩됩니다. UTF-16에서 ASCII 문자 집합은 0-127 값으로 인코딩되며 ASCII가 아닌 문자 (하나 이상의 Java 문자로 구성 될 수 있음)에 대한 인코딩은 숫자 0-127을 포함하지 않도록 보장됩니다.
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
경우 7 비트 인코딩의 처음 32 개 값이 제어 문자이고 최종 값 (0x7F)이이므로 테스트 할 수 있습니다 DEL
.
또는 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;
}
return false
사용하는 대신 isASCII = false
하고 break
.
Apache의 commons-lang3에는이 문제를 포함한 모든 종류의 '문제'에 대한 유용한 유틸리티 / 편의 방법이 포함되어 있습니다.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
이 시도:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
문자열을 반복하고 charAt ()을 사용하여 문자를 가져옵니다. 그런 다음 그것을 int로 취급하고 원하는 유니 코드 값 (ASCII의 상위 집합)이 있는지 확인하십시오.
마음에 들지 않는 첫 번째 휴식.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
를 반환합니다 char
. char
먼저 int로 변환하지 않고 유형 이 int보다 큰지 직접 테스트 할 수 있습니까 ? 아니면 테스트가 자동으로 커버를 수행합니까? 아마도 당신은 할 수 있고 아마도 그렇게 할 수 있습니까? 나는 계속해서 이것을 int로 변환했습니다 if ((int)s.charAt(i) > 127)
. 내 결과가 다른지 확실하지 않지만 실행하는 것이 더 좋습니다. 우리는 다음을 볼 것입니다 :-\
가능했습니다. 꽤 문제입니다.
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;
}
}
//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
return (c > 64 && c < 91) || (c > 96 && c < 123);
}