回答:
グアバ 19.0以降、使用することがあります。
boolean isAscii = CharMatcher.ascii().matchesAllOf(someString);
これは、現在非推奨となっているmatchesAllOf(someString)
メソッドascii()
ではなく、ファクトリメソッドに依存するメソッドを使用します。ASCII
シングルトンます。
ここで、ASCIIには、タブ、改行/改行などの(スペース)より下の印刷不可能な文字を含むすべてのASCII文字が含ま0x20
れますが、BEL
コード0x07
とコードも含まDEL
れます0x7F
。
以前のバージョンのコメントにコードポイントが示されている場合でも、このコードはコードポイントではなく文字を誤って使用します。幸いにも、U+010000
以上の値を持つコードポイントを作成するために必要な文字は、ASCII範囲外の値を持つ2つの代理文字を使用します。したがって、このメソッドは、絵文字を含む文字列であっても、ASCIIのテストに成功します。
ascii()
メソッドのない以前のGuavaバージョンの場合、次のように記述できます。
boolean isAscii = CharMatcher.ASCII.matchesAllOf(someString);
CharMatcher.ASCII
は現在非推奨であり、2018
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
ますか?別の回答を投稿することもできますが、この高く評価されている回答を修正したいと思います。
これは、ライブラリに依存せずに正規表現を使用する別の方法です。
次の1行を使用できます。
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"));
}
}
\P{Print}
と\P{Graph}
説明を含めてもよろしいですか?なぜあなたは必要ですか\A
と\z
?
文字列を反復処理し、すべての文字の値が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
ます。
または、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
Apacheのcommons-lang3には、この問題を含むあらゆる種類の「問題」に対する有用なユーティリティ/便利なメソッドが含まれています。
System.out.println(StringUtils.isAsciiPrintable("!@£$%^&!@£$%^"));
これを試して:
for (char c: string.toCharArray()){
if (((int)c)>127){
return false;
}
}
return true;
文字列を反復処理し、charAt()を使用してcharを取得します。次に、それをintとして扱い、Unicode値(ASCIIのスーパーセット)が適切かどうかを確認します。
あなたが好きではない最初の休憩。
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)
。結果が異なるかどうかはわかりませんが、実行した方が良いと思います。:-\
それは可能でした。かなり問題です。
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);
}