Karakter bir harf ise çağrı Character.isLetter(c)
geri döner true
. Ancak, a'nın String
yalnızca ASCII'nin temel karakterlerini içerip içermediğini hızlıca bulmanın bir yolu var mı?
Karakter bir harf ise çağrı Character.isLetter(c)
geri döner true
. Ancak, a'nın String
yalnızca ASCII'nin temel karakterlerini içerip içermediğini hızlıca bulmanın bir yolu var mı?
Yanıtlar:
Gönderen Guava ileriye 19.0, aşağıdakileri kullanabilirsiniz:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Bu , artık kullanımdan kaldırılan tekli yerine matchesAllOf(someString)
fabrika yöntemine dayanan yöntemi kullanır .ascii()
ASCII
Burada ASCII ASCII karakter içeren dahil basılamayan karakterler daha düşük 0x20
, bu uzantıların, satır besleme / geri dönüş olarak değil, aynı zamanda (boşluk) BEL
kodu ile 0x07
ve DEL
kod ile 0x7F
.
Bu kod, önceki sürümlerin yorumlarında kod noktaları belirtilmiş olsa bile, kod noktaları yerine karakterleri yanlış kullanır. Neyse ki, değeri U+010000
veya üzerinde olan kod noktası oluşturmak için gereken karakterler, ASCII aralığı dışında bir değere sahip iki vekil karakter kullanır. Dolayısıyla yöntem, emoji içeren dizeler için bile ASCII'yi test etmede hala başarılıdır.
ascii()
Yöntem içermeyen önceki Guava sürümleri için şunları yazabilirsiniz:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
şu anda kullanımdan kaldırıldı ve Haziran 2018'de kaldırılmak üzere.
Bunu java.nio.charset.Charset ile yapabilirsiniz .
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
bunun yerine kullanılabilir Charset.forName("US-ASCII")
.
StandardCharsets
? Başka bir cevap gönderebilirim ama bu çok takdir edilen cevabı düzeltmeyi tercih ederim.
Kitaplığa bağlı değil, normal ifade kullanmanın başka bir yolu da burada.
Bu tek satırı kullanabilirsiniz:
text.matches("\\A\\p{ASCII}*\\z")
Tam örnek program:
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}
ve \P{Graph}
+ bir açıklama eklememin bir sakıncası var mı? Neden ihtiyacınız var \A
ve \z
?
Dizeyi yineleyin ve tüm karakterlerin 128'den küçük bir değere sahip olduğundan emin olun.
Java Dizeleri kavramsal olarak UTF-16 olarak kodlanır. UTF-16'da, ASCII karakter seti 0-127 değerleri olarak kodlanır ve ASCII olmayan herhangi bir karakterin (birden fazla Java karakterinden oluşabilir) kodlamasının 0-127 sayılarını içermemesi garanti edilir.
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
, 7 bit kodlamanın ilk 32 değeri kontrol karakterleridir ve son değer (0x7F) olduğundan test etmek isteyebilirsiniz DEL
.
Veya kodu IDN'den kopyalarsınız sınıfından .
// 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
yerine doğrudan kullanmak mümkündür . isASCII = false
break
Apache'nin commons-lang3'ü, bu sorun da dahil olmak üzere her tür "sorun" için değerli yardımcı / kolaylık yöntemleri içerir.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
bunu dene:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Dizeyi yineleyin ve karakteri almak için charAt () kullanın. Sonra bunu int olarak ele alın ve beğendiğiniz bir unicode değerine (ASCII'nin bir üst kümesi) sahip olup olmadığına bakın.
Sevmediğin ilk anda ara ver.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
döndürür a char
. Bir char
türün int'ten büyük olup olmadığını önce int'e dönüştürmeden doğrudan test edebilir misiniz , yoksa testiniz otomatik olarak dönüştürmeyi mi yapıyor? Belki yapabilirsin ve belki yapar? Devam ettim ve şöyle bir int bu dönüştürülen: if ((int)s.charAt(i) > 127)
. Sonuçlarımın farklı olup olmadığından emin değilim ama çalışmasına izin verdiğimde daha iyi hissediyorum. Göreceğiz: - \
Mümkün oldu. Oldukça sorun.
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;
}
}
Bu, String yalnızca ASCII karakterleri içeriyorsa true, içermediğinde false döndürür.
Charset.forName("US-ASCII").newEncoder().canEncode(str)
ASCII olmayanları kaldırmak istiyorsanız, aşağıdaki kod parçacığı:
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);
}