A chamada Character.isLetter(c)
retorna true
se o caractere for uma letra. Mas existe uma maneira de descobrir rapidamente se a String
contém apenas os caracteres básicos do ASCII?
A chamada Character.isLetter(c)
retorna true
se o caractere for uma letra. Mas existe uma maneira de descobrir rapidamente se a String
contém apenas os caracteres básicos do ASCII?
Respostas:
De Guava 19.0 em diante, você pode usar:
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
Este usa o matchesAllOf(someString)
método que depende do método de fábrica ascii()
em vez do agora obsoletoASCII
singleton .
Aqui, ASCII inclui todos os caracteres ASCII, incluindo os caracteres não imprimíveis abaixo de 0x20
(espaço), como tabulações, alimentação de linha / retorno, mas também BEL
com código 0x07
e DEL
com código 0x7F
.
Esse código usa caracteres incorretamente em vez de pontos de código, mesmo se os pontos de código forem indicados nos comentários de versões anteriores. Felizmente, os caracteres necessários para criar o ponto de código com um valor igual U+010000
ou superior a usam dois caracteres substitutos com um valor fora do intervalo ASCII. Portanto, o método ainda consegue testar o ASCII, mesmo para strings contendo emoji.
Para versões anteriores do Guava sem o ascii()
método, você pode escrever:
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
está obsoleto agora e está prestes a ser removido em junho de 2018.
Você pode fazer isso com 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
vez de Charset.forName("US-ASCII")
.
StandardCharsets
? Eu poderia postar outra resposta, mas prefiro corrigir esta resposta muito apreciada.
Aqui está outra maneira, não dependendo de uma biblioteca, mas usando um regex.
Você pode usar esta única linha:
text.matches("\\A\\p{ASCII}*\\z")
Programa de exemplo completo:
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"));
}
}
\P{Print}
e \P{Graph}
+ uma descrição? Por que você precisa \A
e \z
?
Faça a iteração pela string e certifique-se de que todos os caracteres tenham um valor menor que 128.
Java Strings são conceitualmente codificados como UTF-16. Em UTF-16, o conjunto de caracteres ASCII é codificado como os valores 0 - 127 e a codificação para qualquer caractere não ASCII (que pode consistir em mais de um caractere Java) tem garantia de não incluir os números 0 - 127
str.chars().allMatch(c -> c < 128)
c >= 0x20 && c < 0x7F
pois os primeiros 32 valores da codificação de 7 bits são caracteres de controle e o valor final (0x7F) é DEL
.
Ou você copia o código da classe 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
vez de usar isASCII = false
e break
.
commons-lang3 do Apache contém métodos de utilidade / conveniência valiosos para todos os tipos de 'problemas', incluindo este.
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
tente isto:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
Faça a iteração pela string e use charAt () para obter o char. Em seguida, trate-o como um int e veja se ele tem um valor unicode (um superconjunto de ASCII) de sua preferência.
Quebre no primeiro que você não gosta.
private static boolean isASCII(String s)
{
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) > 127)
return false;
return true;
}
charAt
retorna a char
. Você pode testar diretamente se um tipo char
é maior do que um int sem converter em um int, primeiro, ou seu teste faz a conversão automaticamente? Talvez você possa e talvez seja? Fui em frente e convertido este para um int assim: if ((int)s.charAt(i) > 127)
. Não tenho certeza se meus resultados são diferentes, mas me sinto melhor em deixá-lo funcionar. Veremos: - \
Foi possível. Belo problema.
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;
}
}
Retornará verdadeiro se String contiver apenas caracteres ASCII e falso quando não contiver
Charset.forName("US-ASCII").newEncoder().canEncode(str)
Se você deseja remover não ASCII, aqui está o snippet:
if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
str = str.replaceAll("[^\\p{ASCII}]", "");
}
//return is uppercase or lowercase
public boolean isASCIILetter(char c) {
return (c > 64 && c < 91) || (c > 96 && c < 123);
}