如何检查字符串是否只包含 ASCII?

如果字符为字母,则调用 Character.isLetter(c)返回 true。但是有没有一种方法可以快速查明 String是否只包含 ASCII 的基本字符?

125310 次浏览

遍历字符串,并使用 charAt ()获取 char。然后把它当作一个 int,看看它是否有一个您喜欢的 unicode 值(ASCII 的超集)。

一开始你不喜欢就休息。

番石榴19.0开始,您可以使用:

boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);

这使用了依赖于工厂方法 ascii()matchesAllOf(someString)方法,而不是现在已经废弃的 ASCII单例方法。

这里的 ASCII 包括所有的 ASCII 字符 包括低于 0x20(空格)的非打印字符,如制表符、换行符/返回符,还包括代码为 0x07BEL和代码为 0x7FDEL

此代码不正确地使用字符而不是代码点,即使代码点在早期版本的注释中指示。幸运的是,创建值为 U+010000或以上的代码点所需的字符使用了两个值超出 ASCII 范围的代理字符。因此,该方法仍然能够成功地测试 ASCII,即使是包含表情符号的字符串。

对于不使用 ascii()方法的早期番石榴版本,您可以编写:

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
*/
}
}

在字符串中检测非 ASCII 字符

下面是另一种不依赖于库而使用正则表达式的方法。

你可以用这一行:

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"));
}
}

理解正则表达式:

  • Li\\A: 输入开始
  • \\p{ASCII}: 任何 ASCII 字符
  • 所有重复
  • \\z: 输入结束

遍历字符串并确保所有字符的值小于128。

Java 字符串在概念上编码为 UTF-16。在 UTF-16中,ASCII 字符集被编码为值0-127,并且任何非 ASCII 字符(可能由多个 Java 字符组成)的编码都保证不包括数字0-127

或者从 身份识别码类中复制代码。

// 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;
}

试试这个:

for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;

有可能,问题很严重。

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);
}

来自 Apache 的 commons-lang3包含了解决各种“问题”的有价值的实用/方便的方法,包括这一个。

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}

如果 String 只包含 ASCII 字符,则返回 true; 如果不包含 ASCII 字符,则返回 false

Charset.forName("US-ASCII").newEncoder().canEncode(str)

如果您想删除非 ASCII,这里是代码片段:

if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
str = str.replaceAll("[^\\p{ASCII}]", "");
}

在 Java8及以上版本中,可以将 String#codePointsIntStream#allMatch结合使用。

boolean allASCII = str.codePoints().allMatch(c -> c < 128);

在 Kotlin:

fun String.isAsciiString() : Boolean =
this.toCharArray().none { it < ' ' || it > '~' }