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

Java 如何检查字符串是否只包含ASCII码?,java,string,character-encoding,ascii,Java,String,Character Encoding,Ascii,如果字符是字母,则调用Character.isleter(c)返回true。但是有没有一种方法可以快速找到字符串是否只包含ASCII的基本字符?迭代字符串,并使用charAt()获取字符。然后将其视为int,并查看它是否具有您喜欢的unicode值(ASCII的超集) 从您不喜欢的第一个开始中断。从19.0开始,您可以使用: boolean isAscii = CharMatcher.ascii().matchesAllOf(someString); 这使用依赖于工厂方法的方法,而不是现在不推

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

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

从您不喜欢的第一个开始中断。

从19.0开始,您可以使用:

boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
这使用依赖于工厂方法的方法,而不是现在不推荐的
ASCII
singleton

这里,ASCII包括所有ASCII字符,包括小于
0x20
(空格)的不可打印字符,例如制表符、换行/换行符,但也包括
BEL
0x07
以及
DEL
0x7F

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

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

boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
你可以用它来做


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

您可以使用这一行:

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

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


Java字符串在概念上编码为UTF-16。在UTF-16中,ASCII字符集被编码为值0-127,任何非ASCII字符(可能由多个Java字符组成)的编码都保证不包含数字0-127,或者从类中复制代码

//检查字符串是否仅包含US-ASCII码点
//
私有静态布尔值isAllASCII(字符串输入){
布尔值isASCII=true;
对于(int i=0;i0x7F){
isASCII=假;
打破
}
}
返回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;
    }
}
import java.io.UnsupportedEncodingException;
导入java.nio.charset.charset;
导入java.nio.charset.CharsetEncoder;
公共类编码测试{
静态CharsetEncoder ascienceOrder=Charset.forName(“US-ASCII”)
.newEncoder();
公共静态void main(字符串[]args){
String testStr=“·EÀsÆW°WÚi‘T‘3¼Ói‘TÆU2 ~~圆形大厅2号三楼厨房”;
字符串[]strArr=testStr.split(“~~”,2);
整数计数=0;
布尔编码标志=假;
做{
encodeFlag=ascienceodertest(strArr[count]);
System.out.println(encodeFlag);
计数++;
}而(计数
//返回是大写还是小写
公共布尔isASCIILetter(字符c){
返回(c>64&&c<91)| |(c>96&&c<123);
}

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

System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
private静态布尔值isASCII(字符串s)
{
对于(int i=0;i127)
返回false;
返回true;
}

如果字符串仅包含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及以上版本中,可以结合使用

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

+1尽管如果您不需要另一个第三方库,这很好,但科林的答案要短得多,可读性也要高得多。建议使用第三方库是完全可以的,不应该受到反对票的惩罚。我还应该指出,CharMatchers真的非常强大,可以做得更多。此外,除了ASCII之外,还有许多预定义的CharMatcher,以及用于创建自定义CharMatcher的优秀工厂方法。
CharMatcher.ASCII
现在已被弃用,并将于2018年6月被删除。我认为将CharsetEncoder设置为静态不是一个好主意,因为根据文档“这个类的实例对于多个并发线程的使用是不安全的。”@paul_sns,你是对的CharsetEncoder不是线程安全的(但Charset是),所以将其设为静态不是一个好主意。对于Java 1.7或更高版本,可以使用
StandardCharset.US_ASCII
而不是
Charset.forName(“US-ASCII”)
@realHow更正解决方案不必依赖于注释,注意修复此问题,可能使用基于
标准字符集的一行方法
?我可以发布另一个答案,但我宁愿修复此高度赞赏的答案。使用Java 1.8,您可以做到:
str.chars().allMatch(c->c<128)
如果您想要打印字符,您可能需要测试
c>=0x20&&c<0x7F
,因为7位编码的前32个值是控制字符,最终值(0x7F)是
DEL
\\A-输入的开始…\\p{ASCII}*-任意ASCII字符任意时间…\\z-结束input@ArneDeutsch你介意我改进答案,包括对
\P{Print}
\P{Graph}
+的引用吗?为什么你需要
\a
\z
?那是什么正则表达式?我知道$是字符串的结尾,^是开始,从来没有听说过\\a\
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;
}
Charset.forName("US-ASCII").newEncoder().canEncode(str)
if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
                        str = str.replaceAll("[^\\p{ASCII}]", "");
                    }
boolean allASCII = str.codePoints().allMatch(c -> c < 128);