在Java中,是否可以检查一个string是否只有ASCII?

如果字符是字母,则Character.isLetter(c)返回true。 但有没有办法快速find一个string是否只包含ASCII的基本字符?

使用番石榴 ,你可以写:

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

从Guava 19.0起,您应该使用CharMatcher.ascii()来代替。

你可以用java.nio.charset.Charset来完成 。

 import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; public class StringUtils { static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII").newEncoder(); // or "ISO-8859-1" for ISO Latin 1 public static boolean isPureAscii(String v) { return asciiEncoder.canEncode(v); } 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 */ } } 

检测string中的非ASCII字符

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

你可以使用这一行:

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

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

Javastring在概念上被编码为UTF-16。 在UTF-16中,ASCII字符集被编码为值0-127,任何非ASCII字符(可能由多个Java字符组成)的编码保证不包括数字0-127

或者你复制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; } 

来自Apache的commons-lang3包含了对于各种“问题”(包括这个问题)的宝贵实用/便利方法。

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

遍历string,并使用charAt()来获取字符。 然后把它看作一个int,看看它是否有一个你喜欢的unicode值(一个ASCII超集)。

打破你不喜欢的第一个。

尝试这个:

 for (char c: string.toCharArray()){ if (((int)c)>127){ return false; } } return true; 
 private static boolean isASCII(String s) { for (int i = 0; i < s.length(); i++) if (s.charAt(i) > 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; } } 
 //return is uppercase or lowercase public boolean isASCIILetter(char c) { return (c > 64 && c < 91) || (c > 96 && c < 123); }