Jawaban:
Mulai Guava 19.0 dan seterusnya, Anda dapat menggunakan:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Ini menggunakan matchesAllOf(someString)
metode yang bergantung pada metode pabrik ascii()
daripada ASCII
singleton yang sekarang tidak digunakan lagi .
Di sini ASCII menyertakan semua karakter ASCII termasuk karakter yang tidak dapat dicetak lebih rendah dari 0x20
(spasi) seperti tab, line-feed / return tetapi juga BEL
dengan kode 0x07
dan DEL
dengan kode 0x7F
.
Kode ini salah menggunakan karakter daripada poin kode, meskipun poin kode ditunjukkan dalam komentar versi sebelumnya. Untungnya, karakter yang diperlukan untuk membuat titik kode dengan nilai lebih dari U+010000
atau menggunakan dua karakter pengganti dengan nilai di luar rentang ASCII. Jadi metode ini masih berhasil menguji ASCII, bahkan untuk string yang berisi emoji.
Untuk versi Guava sebelumnya tanpa ascii()
metode, Anda dapat menulis:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
sudah usang sekarang dan akan dihapus pada Juni 2018.
Anda dapat melakukannya dengan 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
sebagai pengganti Charset.forName("US-ASCII")
.
StandardCharsets
? Saya dapat memposting jawaban lain tetapi saya lebih suka memperbaiki jawaban yang sangat dihargai ini.
Berikut adalah cara lain untuk tidak bergantung pada pustaka tetapi menggunakan regex.
Anda dapat menggunakan satu baris ini:
text.matches("\\A\\p{ASCII}*\\z")
Seluruh program contoh:
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}
dan \P{Graph}
+ deskripsi? Mengapa Anda membutuhkan \A
dan \z
?
Iterasi melalui string dan pastikan semua karakter memiliki nilai kurang dari 128.
String Java secara konseptual dikodekan sebagai UTF-16. Dalam UTF-16, kumpulan karakter ASCII dikodekan sebagai nilai 0 - 127 dan pengkodean untuk setiap karakter non ASCII (yang mungkin terdiri dari lebih dari satu karakter Java) dijamin tidak menyertakan angka 0 - 127
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
32 nilai pertama dari pengkodean 7 bit adalah karakter kontrol dan nilai akhir (0x7F) adalah DEL
.
Atau Anda menyalin kode dari kelas 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
daripada menggunakan isASCII = false
dan break
.
commons-lang3 dari Apache berisi metode utilitas / kenyamanan yang berharga untuk semua jenis 'masalah', termasuk yang ini.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
coba ini:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Iterasi melalui string, dan gunakan charAt () untuk mendapatkan karakter. Kemudian perlakukan itu sebagai int, dan lihat apakah itu memiliki nilai unicode (superset dari ASCII) yang Anda suka.
Istirahat dulu yang tidak Anda sukai.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
mengembalikan a char
. Dapatkah Anda langsung menguji jika suatu tipe char
lebih besar dari int tanpa mengonversi ke int, pertama, atau apakah pengujian Anda secara otomatis melakukan penutup? Mungkin Anda bisa dan mungkin bisa? Aku pergi ke depan dan dikonversi ini ke int seperti: if ((int)s.charAt(i) > 127)
. Tidak yakin apakah hasil saya berbeda tetapi saya merasa lebih baik untuk membiarkannya berjalan. Kita akan lihat: - \
Itu mungkin saja. Masalah yang lumayan.
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;
}
}
Ini akan mengembalikan nilai true jika String hanya berisi karakter ASCII dan false jika tidak
Charset.forName("US-ASCII").newEncoder().canEncode(str)
Jika Anda ingin menghapus non ASCII, berikut cuplikannya:
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);
}