Answers:
从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);
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
?
遍历字符串,并确保所有字符的值均小于128。
Java字符串在概念上编码为UTF-16。在UTF-16中,ASCII字符集被编码为值0-127,并且任何非ASCII字符(可能包含多个Java字符)的编码都保证不包含数字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;
遍历字符串,并使用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
返回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;
}
}
//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
return (c > 64 && c < 91) || (c > 96 && c < 123);
}