การโทรCharacter.isLetter(c)
จะส่งกลับtrue
หากอักขระเป็นตัวอักษร แต่มีวิธีค้นหาอย่างรวดเร็วว่ามีString
เพียงอักขระพื้นฐานของ ASCII หรือไม่?
การโทรCharacter.isLetter(c)
จะส่งกลับtrue
หากอักขระเป็นตัวอักษร แต่มีวิธีค้นหาอย่างรวดเร็วว่ามีString
เพียงอักขระพื้นฐานของ ASCII หรือไม่?
คำตอบ:
ตั้งแต่Guava 19.0 เป็นต้นไปคุณสามารถใช้:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
สิ่งนี้ใช้matchesAllOf(someString)
วิธีการที่อาศัยวิธีการของโรงงานascii()
แทนที่จะเป็นASCII
ซิงเกิลตันที่เลิกใช้แล้วในขณะนี้
นี่ ASCII ประกอบด้วยอักขระ ASCII ทั้งหมดรวมทั้งตัวละครที่ไม่สามารถพิมพ์ต่ำกว่า0x20
(เว้นวรรค) เช่นแท็บสายฟีด / การกลับมา แต่ยังBEL
มีรหัส0x07
และมีรหัสDEL
0x7F
รหัสนี้ใช้อักขระแทนจุดรหัสอย่างไม่ถูกต้องแม้ว่าจะมีการระบุจุดรหัสในข้อคิดเห็นของเวอร์ชันก่อนหน้าก็ตาม โชคดีที่อักขระที่จำเป็นในการสร้างจุดรหัสที่มีค่าU+010000
หรือมากกว่านั้นใช้อักขระตัวแทนสองตัวที่มีค่าอยู่นอกช่วง ASCII ดังนั้นวิธีนี้ยังคงประสบความสำเร็จในการทดสอบ ASCII แม้กระทั่งสำหรับสตริงที่มีอิโมจิ
สำหรับ Guava เวอร์ชันก่อนหน้าโดยไม่มีascii()
วิธีการที่คุณสามารถเขียน:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
เลิกใช้แล้วและกำลังจะถูกลบออกในเดือนมิถุนายน 2018
คุณสามารถทำมันได้ด้วย 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
? ฉันสามารถโพสต์คำตอบอื่นได้ แต่ฉันอยากจะแก้ไขคำตอบที่ชื่นชมนี้
นี่เป็นอีกวิธีหนึ่งที่ไม่ได้ขึ้นอยู่กับไลบรารี แต่ใช้ regex
คุณสามารถใช้บรรทัดเดียวนี้:
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 Strings ถูกเข้ารหัสตามแนวคิดเป็น UTF-16 ใน UTF-16 ชุดอักขระ ASCII จะถูกเข้ารหัสเป็นค่า 0 - 127 และการเข้ารหัสสำหรับอักขระที่ไม่ใช่ ASCII (ซึ่งอาจประกอบด้วยอักขระ Java มากกว่าหนึ่งตัว) รับประกันว่าจะไม่รวมตัวเลข 0 - 127
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
เป็น 32 ค่าแรกของการเข้ารหัส 7 บิตเป็นตัวควบคุมและค่าสุดท้าย (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
commons-lang3 จาก Apache มียูทิลิตี้ / วิธีอำนวยความสะดวกที่มีค่าสำหรับ 'ปัญหา' ทุกประเภทรวมถึงปัญหานี้ด้วย
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
ลองสิ่งนี้:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
วนซ้ำผ่านสตริงและใช้ charAt () เพื่อรับ char จากนั้นถือว่าเป็น int และดูว่ามีค่า Unicode (ชุดย่อยของ 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
ส่งคืน a 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;
}
}
สิ่งนี้จะคืนค่าเป็นจริงหาก String มีเฉพาะอักขระ ASCII และเป็นเท็จเมื่อไม่มี
Charset.forName("US-ASCII").newEncoder().canEncode(str)
หากคุณต้องการลบที่ไม่ใช่ ASCII นี่คือตัวอย่าง:
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);
}