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

2022-08-31 08:09:23

如果字符是字母,则返回调用。但是有没有办法快速找到 是否只包含 ASCII 的基本字符?Character.isLetter(c)trueString


答案 1

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

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

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

在这里,ASCII包括所有ASCII字符,包括小于(空格)的不可打印字符,例如制表符,换行符/返回,但也包括代码和代码。0x20BEL0x07DEL0x7F

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

对于没有该方法的早期番石榴版本,您可以编写:ascii()

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

答案 2

你可以用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 字符