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

时间:2010-08-27 14:19:11

标签: java string ascii

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

13 个答案:

答案 0 :(得分:114)

Guava 19.0开始,您可以使用:

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

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

此处ASCII包括所有ASCII字符,包括低于0x20(空格)的不可打印字符,例如标签,换行/返回,还有BEL代码0x07DEL代码为0x7F

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

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

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

答案 1 :(得分:94)

您可以使用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
      */
  }
}

Detect non-ASCII character in a String

答案 2 :(得分:70)

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

您可以使用以下单行:

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

答案 3 :(得分:52)

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

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

答案 4 :(得分: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;
}

答案 5 :(得分:9)

来自Apache的

commons-lang3包含了针对各种“问题”的有价值的实用/便利方法,包括这个问题。

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));

答案 6 :(得分:4)

试试这个:

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

答案 7 :(得分:2)

遍历字符串,并使用charAt()获取char。然后将其视为int,并查看它是否具有您喜欢的unicode值(ASCII的超集)。

在第一个你不喜欢的地方休息。

答案 8 :(得分:1)

private static boolean isASCII(String s) 
{
    for (int i = 0; i < s.length(); i++) 
        if (s.charAt(i) > 127) 
            return false;
    return true;
}

答案 9 :(得分:0)

有可能。很不错。

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

答案 10 :(得分:0)

如果String仅包含ASCII字符,则返回true,否则返回

////////// - Lots Of Spacing
func exampleFunctionOne(newText: String) {

    if newText.isEmpty {

        return

    }

    exampleLabel.text = newText

    return
}


////////// - Little Spacing
func exampleFunctionTwo(newText: String) {
    if newText.isEmpty { return }
    exampleLabel.text = newText; return
}

如果要删除非ASCII,请参见以下代码段:

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

答案 11 :(得分:0)

在 Java 8 及更高版本中,可以将 String#codePointsIntStream#allMatch 结合使用。

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

答案 12 :(得分:-1)

//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
  return (c > 64 && c < 91) || (c > 96 && c < 123);
}