【发布时间】:2011-04-04 20:16:18
【问题描述】:
如果字符是字母,则调用 Character.isLetter(c) 返回 true。但是有没有办法快速找到String 是否只包含ASCII 的基本字符?
【问题讨论】:
标签: java string character-encoding ascii
如果字符是字母,则调用 Character.isLetter(c) 返回 true。但是有没有办法快速找到String 是否只包含ASCII 的基本字符?
【问题讨论】:
标签: java string character-encoding ascii
这是另一种方法,不依赖于库,而是使用正则表达式。
你可以使用这一行:
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"));
}
}
理解正则表达式:
\\A : 输入开始\\p{ASCII} : 任意 ASCII 字符*:所有重复\\z:输入结束【讨论】:
\P{Print} 和\P{Graph} 的引用+ 描述吗?为什么需要\A 和\z?
在 Kotlin 中:
fun String.isAsciiString() : Boolean =
this.toCharArray().none { it < ' ' || it > '~' }
【讨论】:
在 Java 8 及更高版本中,可以将String#codePoints 与IntStream#allMatch 结合使用。
boolean allASCII = str.codePoints().allMatch(c -> c < 128);
【讨论】:
如果 String 只包含 ASCII 字符则返回 true,否则返回 false
Charset.forName("US-ASCII").newEncoder().canEncode(str)
如果你想删除非 ASCII ,这里是 sn-p:
if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
str = str.replaceAll("[^\\p{ASCII}]", "");
}
【讨论】:
StandardCharsets.US_ASCII.newEncoder().canEncode(str)
您可以使用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
*/
}
}
【讨论】:
StandardCharsets.US_ASCII 而不是Charset.forName("US-ASCII")。
StandardCharsets 的 oneliner 方法?我可以发布另一个答案,但我宁愿修复这个高度赞赏的答案。
从Guava19.0 起,您可以使用:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
这使用了 matchesAllOf(someString) 方法,该方法依赖于工厂方法 ascii(),而不是现在已弃用的 ASCII 单例。
这里 ASCII 包括所有 ASCII 字符包括低于0x20(空格)的不可打印字符,例如制表符、换行符/回车符,还有代码为0x07 的BEL 和DEL 代码为0x7F。
此代码错误地使用字符而不是代码点,即使代码点在早期版本的 cmets 中指示。幸运的是,创建具有 U+010000 或更大值的代码点所需的字符使用两个具有 ASCII 范围之外的值的代理字符。所以该方法仍然可以成功地测试 ASCII,即使是包含表情符号的字符串。
对于没有 ascii() 方法的早期 Guava 版本,您可以编写:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
【讨论】:
CharMatcher.ASCII 现已弃用,将于 2018 年 6 月删除。
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
【讨论】:
charAt 返回 char。您是否可以直接测试类型 char 是否大于 int 而无需首先转换为 int,或者您的测试是否会自动进行覆盖?也许你可以,也许它可以?我继续将其转换为 int,如下所示:if ((int)s.charAt(i) > 127)。不确定我的结果是否有任何不同,但让它运行我感觉更好。我们会看到:-\
来自 Apache 的 commons-lang3 包含针对各种“问题”的有价值的实用程序/便利方法,包括这个问题。
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
【讨论】:
这是可能的。好问题。
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);
}
【讨论】:
试试这个:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
【讨论】:
或者你从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;
}
【讨论】:
return false,而不是使用isASCII = false和break。
遍历字符串并确保所有字符的值都小于 128。
Java 字符串在概念上被编码为 UTF-16。在 UTF-16 中,ASCII 字符集被编码为值 0 - 127,并且任何非 ASCII 字符(可能包含多个 Java 字符)的编码都保证不包含数字 0 - 127
【讨论】:
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F,因为 7 位编码的前 32 个值是控制字符,最终值 (0x7F) 是 DEL。
遍历字符串,并使用 charAt() 获取字符。然后把它当作一个int,看看它是否有你喜欢的unicode值(ASCII的超集)。
在你不喜欢的第一个休息。
【讨论】: