यदि वर्ण एक अक्षर है तो कॉल Character.isLetter(c)
वापस आ true
जाता है। लेकिन क्या कोई रास्ता जल्दी से पता चल सकता है कि क्या String
केवल ASCII के आधार वर्ण हैं?
यदि वर्ण एक अक्षर है तो कॉल Character.isLetter(c)
वापस आ true
जाता है। लेकिन क्या कोई रास्ता जल्दी से पता चल सकता है कि क्या String
केवल ASCII के आधार वर्ण हैं?
जवाबों:
से अमरूद 19.0 आगे, आप उपयोग कर सकते हैं:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
यह उस matchesAllOf(someString)
विधि का उपयोग करता है जो ascii()
अब पदावनत ASCII
सिंगलटन के बजाय फैक्ट्री विधि पर निर्भर करता है ।
यहाँ ASCII में सभी ASCII वर्ण शामिल हैं , जिनमें गैर-मुद्रण योग्य वर्ण 0x20
(स्पेस) से कम हैं जैसे कि टैब, लाइन-फीड / रिटर्न लेकिन BEL
कोड के साथ 0x07
और कोड के साथ भी ।DEL
0x7F
यह कोड कोड बिंदुओं के बजाय वर्णों का गलत उपयोग करता है, भले ही कोड बिंदुओं को पहले के संस्करणों की टिप्पणियों में दर्शाया गया हो। सौभाग्य से, U+010000
ASCII श्रेणी के बाहर के मान के साथ या उसके ऊपर दो मान वाले वर्णों का उपयोग करके कोड बिंदु बनाने के लिए आवश्यक वर्णों का उपयोग किया जाता है। तो विधि अभी भी ASCII के लिए परीक्षण में सफल होती है, यहां तक कि इमोजी वाले तार के लिए भी।
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
? मैं एक और उत्तर पोस्ट कर सकता था, लेकिन मैं इस अत्यधिक प्रशंसित उत्तर को ठीक करूंगा।
यहां एक और तरीका है जो एक पुस्तकालय पर निर्भर नहीं करता है, लेकिन एक रेगेक्स का उपयोग करता है।
आप इस एकल पंक्ति का उपयोग कर सकते हैं:
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
?
स्ट्रिंग के माध्यम से Iterate करें और सुनिश्चित करें कि सभी वर्णों का मान 128 से कम है।
जावा स्ट्रिंग्स को UTF-16 के रूप में अवधारणात्मक रूप से एन्कोड किया गया है। UTF-16 में, ASCII वर्ण सेट मान 0 - 127 के रूप में एन्कोड किया गया है और किसी भी गैर ASCII वर्ण के लिए एन्कोडिंग (जिसमें एक से अधिक जावा चार शामिल हो सकते हैं) को 0 - 127 नंबर शामिल नहीं करने की गारंटी है
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
7 बिट एन्कोडिंग के पहले 32 मानों को नियंत्रित करना चाहते हैं और अंतिम मान (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
।
Apache से commons-lang3 में इस एक सहित सभी प्रकार की 'समस्याओं' के लिए मूल्यवान उपयोगिता / सुविधा विधियाँ शामिल हैं।
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
इसे इस्तेमाल करे:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
स्ट्रिंग के माध्यम से Iterate करें, और char पाने के लिए charAt () का उपयोग करें। फिर इसे एक इंट के रूप में मानें, और देखें कि क्या इसका यूनिकोड मान (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
एक रिटर्न char
। क्या आप सीधे परीक्षण कर सकते हैं यदि कोई प्रकार char
एक इंट से अधिक एक इंट से पहले बिना परिवर्तित होता है, या आपका परीक्षण स्वचालित रूप से सहवास करता है? शायद आप कर सकते हैं और शायद यह करता है? मैं आगे बढ़ा और इसे एक इंट में बदल दिया जैसे 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;
}
}
यह सच हो जाएगा अगर स्ट्रिंग में केवल 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);
}