web-dev-qa-db-ja.com

文字列にASCIIのみが含まれているかどうかを確認することはできますか?

文字が文字の場合、Character.isLetter(c)呼び出しはtrueを返します。しかし、StringにASCIIの基本文字のみが含まれているかどうかをすばやく見つける方法はありますか?

108
TambourineMan

Guava 19.0以降では、次を使用できます。

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

これは、現在廃止されているASCIIシングルトンではなく、ファクトリメソッド matchesAllOf(someString) に依存する ascii() メソッドを使用します。

ここで、ASCIIには、すべてのASCII文字が含まれます含むタブ、改行/リターンなどの0x20(スペース)よりも小さい非印刷可能文字コード0x07BELおよびコード0x7FDELもあります。

このコードでは、以前のバージョンのコメントでコードポイントが示されている場合でも、コードポイントではなく文字が誤って使用されます。幸いなことに、U+010000以上の値を持つコードポイントを作成するために必要な文字は、ASCIIの範囲外の値を持つ2つの代理文字を使用します。したがって、このメソッドは、絵文字を含む文字列であっても、ASCIIのテストに引き続き成功します。

ascii()メソッドを使用しない以前のGuavaバージョンの場合、次のように記述できます。

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

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
      */
  }
}

文字列内の非ASCII文字を検出

98
RealHowTo

ライブラリに依存せず、正規表現を使用する別の方法があります。

次の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"));
    }
}
73
Arne Deutsch

文字列を繰り返し処理し、すべての文字の値が128未満であることを確認します。

Java文字列は、概念的にUTF-16としてエンコードされます。 UTF-16では、ASCII文字セットは値0から127としてエンコードされ、非ASCII文字(複数のJava文字で構成される場合がある)のエンコードが保証されます0〜127の数字を含めない

53
JeremyP

または、コードを 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;
}
14
Zarathustra

apacheのcommons-lang3には、これを含むすべての種類の「問題」に対する有用なユーティリティ/便利なメソッドが含まれています。

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

これを試して:

for (char c: string.toCharArray()){
  if (((int)c)>127){
    return false;
  } 
}
return true;
4
pforyogurt

文字列を反復処理し、charAt()を使用して文字を取得します。次に、それを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;
}
1
fdsfdsfdsfds

これは、StringがASCII文字のみを含む場合はtrueを返し、含まない場合はfalseを返します

Charset.forName("US-ASCII").newEncoder().canEncode(str)

非ASCIIを削除する場合は、次のスニペットがあります。

if(!Charset.forName("US-ASCII").newEncoder().canEncode(str)) {
                        str = str.replaceAll("[^\\p{ASCII}]", "");
                    }
0
mike oganyan

それは可能でした。かなりの問題。

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;
    }
}
0
user3614583