Cuộc gọi Character.isLetter(c)
trở lại true
nếu ký tự là một chữ cái. Nhưng có cách nào để nhanh chóng tìm ra nếu String
chỉ chứa các ký tự cơ bản của ASCII không?
Cuộc gọi Character.isLetter(c)
trở lại true
nếu ký tự là một chữ cái. Nhưng có cách nào để nhanh chóng tìm ra nếu String
chỉ chứa các ký tự cơ bản của ASCII không?
Câu trả lời:
Từ Guava 19.0 trở đi, bạn có thể sử dụng:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Điều này sử dụng matchesAllOf(someString)
phương pháp dựa trên phương thức xuất xưởng ascii()
thay vì ASCII
đơn lẻ hiện không dùng nữa .
Dưới đây ASCII bao gồm tất cả các ký tự ASCII bao gồm các ký tự không thể in được hạ thấp hơn 0x20
(không gian) như tab, dòng thức ăn / lợi nhuận mà còn BEL
với mã 0x07
và DEL
với mã 0x7F
.
Mã này sử dụng không chính xác các ký tự thay vì các điểm mã, ngay cả khi các điểm mã được chỉ định trong các nhận xét của các phiên bản trước đó. May mắn thay, các ký tự được yêu cầu để tạo điểm mã có giá trị bằng U+010000
hoặc hơn sử dụng hai ký tự thay thế có giá trị nằm ngoài phạm vi ASCII. Vì vậy, phương pháp vẫn thành công trong việc thử nghiệm ASCII, ngay cả đối với các chuỗi có chứa biểu tượng cảm xúc.
Đối với các phiên bản Guava trước đó mà không có ascii()
phương pháp bạn có thể viết:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
không được chấp nhận ngay bây giờ và sắp bị xóa vào tháng 6 năm 2018.
Bạn có thể làm điều đó với 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
thay thế Charset.forName("US-ASCII")
.
StandardCharsets
? Tôi có thể đăng một câu trả lời khác nhưng tôi muốn sửa câu trả lời được đánh giá cao này.
Đây là một cách khác không phụ thuộc vào thư viện mà sử dụng regex.
Bạn có thể sử dụng dòng duy nhất này:
text.matches("\\A\\p{ASCII}*\\z")
Toàn bộ chương trình ví dụ:
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}
và \P{Graph}
+ một mô tả không? Tại sao bạn cần \A
và \z
?
Lặp lại qua chuỗi và đảm bảo tất cả các ký tự có giá trị nhỏ hơn 128.
Chuỗi Java được mã hóa theo khái niệm là UTF-16. Trong UTF-16, bộ ký tự ASCII được mã hóa thành các giá trị 0 - 127 và mã hóa cho bất kỳ ký tự không phải ASCII nào (có thể bao gồm nhiều hơn một char Java) được đảm bảo không bao gồm các số 0 - 127
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
32 giá trị đầu tiên của mã hóa 7 bit là các ký tự điều khiển và giá trị cuối cùng (0x7F) là DEL
.
Hoặc bạn sao chép mã từ lớp 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
thay vì sử dụng isASCII = false
và break
.
commons-lang3 từ Apache chứa các phương thức tiện ích / tiện ích có giá trị cho tất cả các loại 'vấn đề', bao gồm cả phương pháp này.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
thử cái này:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Lặp lại qua chuỗi và sử dụng charAt () để lấy char. Sau đó coi nó như một int và xem nó có giá trị unicode (siêu bộ ASCII) mà bạn thích không.
Nghỉ lúc đầu bạn không thích.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
trả về a char
. Bạn có thể kiểm tra trực tiếp nếu một loại char
lớn hơn int mà không chuyển đổi thành int, trước tiên, hoặc thử nghiệm của bạn có tự động thực hiện bao phủ không? Có lẽ bạn có thể và có thể nó không? Tôi đã đi trước và chuyển đổi nó thành một int như vậy : if ((int)s.charAt(i) > 127)
. Không chắc kết quả của tôi có khác đi không nhưng tôi cảm thấy tốt hơn khi để nó chạy. Chúng ta sẽ thấy: - \
Điều đó là có thể. Vấn đề khá.
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;
}
}
Điều này sẽ trả về true nếu String chỉ chứa các ký tự ASCII và false khi nó không
Charset.forName("US-ASCII").newEncoder().canEncode(str)
Nếu bạn muốn xóa không phải ASCII, đây là đoạn trích:
if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
str = str.replaceAll("[^\\p{ASCII}]", "");
}
//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
return (c > 64 && c < 91) || (c > 96 && c < 123);
}