是否可以检查String是否只包含ASCII?

Tam*_*Man 109 java string ascii

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

Col*_*inD 120

Guava 19.0开始,您可以使用:

boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Run Code Online (Sandbox Code Playgroud)

这使用的matchesAllOf(someString)方法依赖于工厂方法ascii()而不是现在弃用的ASCII单例.

这里ASCII包括所有ASCII字符,包括低于0x20(空格)的不可打印字符,例如制表符,换行/返回,但也BEL包含代码0x07DEL代码0x7F.

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

对于没有这种ascii()方法的早期Guava版本,您可以编写:

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
Run Code Online (Sandbox Code Playgroud)

  • +1虽然如果你不需要另一个第三方库是好的,但Colin的答案要短得多,而且更具可读性.建议第三方图书馆是完全可以的,不应该以反对票来惩罚. (31认同)
  • `CharMatcher.ASCII`现已弃用,即将于2018年6月删除. (7认同)

Rea*_*wTo 98

你可以用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
      */
  }
}
Run Code Online (Sandbox Code Playgroud)

检测字符串中的非ASCII字符

  • 我认为将CharsetEncoder设置为静态不是一个好主意,因为根据文档"这个类的实例不适合多个并发线程使用." (10认同)
  • 使用Java 1.7或更高版本,可以使用`StandardCharsets.US_ASCII`而不是`Charset.forName("US-ASCII")`. (8认同)
  • 感谢您使用Java解决方案,而不是Guava. (4认同)

Arn*_*sch 73

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

您可以使用以下单行:

text.matches("\\A\\p{ASCII}*\\z")
Run Code Online (Sandbox Code Playgroud)

整个示例程序:

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • \\ A - 输入的开始... \\ p {ASCII}* - 任何时候任何ASCII字符... \\ z - 输入结束 (14认同)
  • 如果你解释这个正则表达式会很棒. (2认同)

Jer*_*myP 55

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

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

  • 使用Java 1.8,您可以:`str.chars().allMatch(c - > c <128)` (25认同)
  • 如果你想要可打印字符,你可能想测试`c> = 0x20 && c <0x7F`,因为7位编码的前32个值是控制字符,最终值(0x7F)是'DEL`. (6认同)
  • 这应该是最好的答案.只需检查它是否<128,简单. (3认同)

Zar*_*tra 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;
}
Run Code Online (Sandbox Code Playgroud)


小智 11

来自Apache的commons-lang3包含了各种"问题"的有价值的实用/便利方法,包括这个问题.

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
Run Code Online (Sandbox Code Playgroud)

  • @therealprashant 如果方法名称是 isAscii 我会同意你的观点。但名为 isAsciiPrintable 的方法暗示他们可能故意排除了 0 到 31 的字符。 (2认同)