调用Character.isLetter(c)
如果字符是字母将返回true
。但是有没有一种快速的方法可以找到一个String
是否只包含ASCII基本字符?
调用Character.isLetter(c)
如果字符是字母将返回true
。但是有没有一种快速的方法可以找到一个String
是否只包含ASCII基本字符?
从 Guava 19.0 开始,您可以使用:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
这里使用了matchesAllOf(someString)
方法,它依赖于工厂方法ascii()
而不是现在已弃用的ASCII
单例。
这里的ASCII包括所有ASCII字符,包括小于0x20
(空格)的不可打印字符,例如制表符、换行/回车,以及代码为0x07
的BEL
和代码为0x7F
的DEL
。
即使先前版本的注释中指示了代码点,但此代码错误地使用了字符而不是代码点。幸运的是,创建值为U+010000
或更高的代码点所需的字符使用了两个超出ASCII范围的代理字符。因此,该方法仍然可以成功地测试ASCII,即使字符串包含表情符号。
对于没有ascii()
方法的早期Guava版本,您可以编写以下内容:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
你可以使用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")
。 - Julian LettnerStandardCharsets
的一行代码方法?我可以发布另一个答案,但我宁愿修复这个备受赞赏的答案。 - Maarten Bodewes以下是另一种不依赖库且使用正则表达式的方法。
您可以使用下面这行代码:
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"));
}
}
理解正则表达式:
\\A
:输入的起始位置\\p{ASCII}
:任何 ASCII 字符*
:所有重复\\z
:输入的终止位置\P{Print}
和\P{Graph}
的引用以及描述吗?为什么需要\A
和\z
? - Maarten Bodewes迭代字符串并确保所有字符的值小于128。
Java字符串在概念上被编码为UTF-16。 在UTF-16中,ASCII字符集被编码为值0-127,任何非ASCII字符的编码(可能由多个Java字符组成)都保证不包含数字0-127.
str.chars().allMatch(c -> c < 128)
。意思是检查字符串中的所有字符是否都是ASCII码(即小于128)。 - Julian Lettnerc >= 0x20 && c < 0x7F
。因为在七位编码中的前32个值是控制字符,最后一个值 (0x7F) 是 DEL
。请注意不改变原文的意思。 - Maarten Bodewes或者您可以从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
也是可以的。 - Maarten BodewesApache 的 commons-lang3 包含了很多有用的实用程序/便利方法,可以解决各种“问题”,包括此问题。
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
试一下这个:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
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
,如下所示:if ((int)s.charAt(i) > 127)
。不确定我的结果是否有任何不同,但我对让它运行感到更加放心。我们拭目以待 :-\ - harpervilleString#codePoints
和IntStream#allMatch
结合使用。boolean allASCII = str.codePoints().allMatch(c -> c < 128);
如果字符串仅包含ASCII字符,则返回true,否则返回false。
最初的回答:This will return true if String only contains ASCII characters and false when it does not
Charset.forName("US-ASCII").newEncoder().canEncode(str)
如果你想要移除非ASCII字符,这是代码片段:
if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
str = str.replaceAll("[^\\p{ASCII}]", "");
}
StandardCharsets.US_ASCII.newEncoder().canEncode(str)
- user2077221[^\\p{ASCII}]
,即 \\P{ASCII}
。大写字母 \P 是小写字母 \p 的补集。 - Ahmet
CharMatcher.ASCII
现已被弃用,并将于2018年6月被删除。 - thisarattr