如果字符是字母,则调用Character.isLetter(c)
会返回true
。但有没有办法快速查找String
是否只包含ASCII的基本字符?
答案 0 :(得分:114)
从Guava 19.0开始,您可以使用:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
这使用matchesAllOf(someString)
方法,该方法依赖于工厂方法ascii()
,而不是现在已弃用的ASCII
单例。
此处ASCII包括所有ASCII字符,包括低于0x20
(空格)的不可打印字符,例如标签,换行/返回,还有BEL
代码0x07
和DEL
代码为0x7F
。
此代码错误地使用字符而不是代码点,即使在早期版本的注释中指示了代码点。幸运的是,创建值为U+010000
或更高的代码点所需的字符使用两个代理字符,其值超出ASCII范围。因此,即使是包含表情符号的字符串,该方法仍然可以成功测试ASCII。
对于没有ascii()
方法的早期Guava版本,您可以写:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
答案 1 :(得分:94)
您可以使用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
*/
}
}
答案 2 :(得分:70)
这是另一种不依赖于库而是使用正则表达式的方法。
您可以使用以下单行:
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"));
}
}
答案 3 :(得分:52)
遍历字符串并确保所有字符的值都小于128。
Java字符串在概念上编码为UTF-16。在UTF-16中,ASCII字符集编码为值0 - 127,并且任何非ASCII字符(可能包含多个Java字符)的编码都保证不包含数字0 - 127
答案 4 :(得分:14)
或者您从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;
}
答案 5 :(得分:9)
commons-lang3包含了针对各种“问题”的有价值的实用/便利方法,包括这个问题。
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
答案 6 :(得分:4)
试试这个:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
答案 7 :(得分:2)
遍历字符串,并使用charAt()获取char。然后将其视为int,并查看它是否具有您喜欢的unicode值(ASCII的超集)。
在第一个你不喜欢的地方休息。
答案 8 :(得分:1)
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
答案 9 :(得分:0)
有可能。很不错。
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;
}
}
答案 10 :(得分:0)
如果String仅包含ASCII字符,则返回true,否则返回
////////// - Lots Of Spacing
func exampleFunctionOne(newText: String) {
if newText.isEmpty {
return
}
exampleLabel.text = newText
return
}
////////// - Little Spacing
func exampleFunctionTwo(newText: String) {
if newText.isEmpty { return }
exampleLabel.text = newText; return
}
如果要删除非ASCII,请参见以下代码段:
Charset.forName("US-ASCII").newEncoder().canEncode(str)
答案 11 :(得分:0)
在 Java 8 及更高版本中,可以将 String#codePoints
与 IntStream#allMatch
结合使用。
boolean allASCII = str.codePoints().allMatch(c -> c < 128);
答案 12 :(得分:-1)
//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
return (c > 64 && c < 91) || (c > 96 && c < 123);
}