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ÚiT3¼ÓiTÆ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);