Character.isLetter (c) trả về 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 một String chỉ chứa các ký tự cơ sở của ASCII?Trong Java, có thể kiểm tra xem một chuỗi chỉ là ASCII không?
Trả lời
Sử dụng Guava, bạn chỉ có thể viết:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
Từ Ổi 19.0 trở đi, bạn nên sử dụng CharMatcher.ascii()
để thay thế.
Ah, những điều kỳ diệu của các lớp trừu tượng :) –
Đẹp một Colin. –
+1 Mặc dù rất tốt nếu bạn không cần thư viện của bên thứ ba khác, câu trả lời của Colin ngắn hơn và dễ đọc hơn nhiều. Đề xuất thư viện của bên thứ ba hoàn toàn OK và không nên bị trừng phạt với phiếu bầu âm. – Jesper
Lặp lại chuỗi và sử dụng charAt() để lấy char. Sau đó xử lý nó như là một int, và xem nếu nó có một giá trị unicode (một superset của ASCII) mà bạn thích.
Hãy phá vỡ điểm đầu tiên bạn không thích.
Bạn có thể làm điều đó với java.nio.charset.Charset.
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
public class StringUtils {
static CharsetEncoder asciiEncoder =
Charset.forName("US-ASCII").newEncoder(); // or "ISO-8859-1" for ISO Latin 1
public static boolean isPureAscii(String v) {
return asciiEncoder.canEncode(v);
}
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
*/
}
}
Tôi không nghĩ rằng làm cho CharsetEncoder tĩnh trở nên tĩnh vì theo tài liệu" Các trường hợp của lớp này không an toàn để sử dụng bởi nhiều đồng thời chủ đề. " –
@paul_sns, bạn đúng CharsetEncoder không phải là chủ đề an toàn (nhưng Charset là) vì vậy nó không phải là một ý tưởng tốt để làm cho nó tĩnh. – RealHowTo
Với Java 1.7 hoặc cao hơn có thể sử dụng 'StandardCharsets.US_ASCII' thay vì' Charset.forName ("US-ASCII") '. –
Đây là một cách khác không phụ thuộc vào một thư viện nhưng sử dụng một regex.
Bạn có thể sử dụng dòng này:
text.matches("\\A\\p{ASCII}*\\z")
Tổng số các 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"));
}
}
Thật tuyệt vời nếu bạn giải thích regex này. –
\\ A - Bắt đầu từ đầu vào ... \\ p {ASCII} * - Bất kỳ ký tự ASCII nào bất kỳ lúc nào ... \\ z - Kết thúc đầu vào – Arne
Duyệt qua chuỗi và chắc chắn rằng tất cả các nhân vật đều có một giá trị nhỏ hơn 128.
Các chuỗi Java được mã hóa theo khái niệm như UTF-16. Trong UTF-16, bộ ký tự ASCII được mã hóa dưới dạng giá trị 0 - 127 và mã hóa cho bất kỳ ký tự ASCII nào (có thể bao gồm nhiều hơn một Java char) được đảm bảo không bao gồm các số 0 - 127
Đây phải là câu trả lời hàng đầu. Chỉ cần kiểm tra xem nó <128, đơn giản. –
Với Java 1.8 bạn có thể làm: 'str.chars(). AllMatch (c -> c <128)' –
Nếu bạn muốn các ký tự có thể in, bạn có thể muốn kiểm tra 'c> = 0x20 && c <0x7F' làm 32 giá trị 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;
}
Điều này thậm chí hoạt động với 2-char-unicode vì char đầu tiên là> = U + D800 – k3b
thử điều này:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Đó là có thể. Khá là vấn đề.
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);
}
commons-lang3 từ Apache chứa phương pháp hữu ích/tiện có giá trị cho tất cả các loại 'vấn đề', trong đó có một này.
System.out.println(StringUtils.isAsciiPrintable("[email protected]£$%^&[email protected]£$%^"));
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
Hãy chấp nhận câu trả lời jeremyP như đó là không cần phụ thuộc, và không epically đang tiết, và làm sáng tỏ định nghĩa rất và lịch sử của các ký tự ASCII. – samthebest