Java如何检测字符串中的非ASCII字符?

下面的代码检测给定的字符串中是否包含非ASCII字符。我们使用包中的CharsetDecoder类java.nio将字符串解码为有效的US-ASCII字符集。

package org.nhooo.example.io;

import java.nio.charset.CharsetDecoder;
import java.nio.charset.Charset;
import java.nio.charset.CharacterCodingException;
import java.nio.CharBuffer;
import java.nio.ByteBuffer;
import java.util.Arrays;

public class NonAsciiValidation {
    public static void main(String[] args) {
        // 此字符串包含一个非ASCII字符,将产生异常
        //在这个程序中。第二个字符串只有一个有效的ASCII字符。
        byte[] invalidBytes = "Copyright Â© 2017 Kode Java Org".getBytes();
        byte[] validBytes = "Copyright (c) 2017 Kode Java Org".getBytes();

        // 返回命名字符集的字符集对象。
        CharsetDecoder decoder = Charset.forName("US-ASCII").newDecoder();
        try {
            CharBuffer buffer = decoder.decode(ByteBuffer.wrap(validBytes));
            System.out.println(Arrays.toString(buffer.array()));

            buffer = decoder.decode(ByteBuffer.wrap(invalidBytes));
            System.out.println(Arrays.toString(buffer.array()));
        } catch (CharacterCodingException e) {
            System.err.println("The information contains a non ASCII character(s).");
            e.printStackTrace();
        }
    }
}

以下是程序的结果:

The information contains a non ASCII character(s).
[C, o, p, y, r, i, g, h, t,  , (, c, ),  , 2, 0, 1, 7,  , K, o, d, e,  , J, a, v, a,  , O, r, g]
java.nio.charset.MalformedInputException: Input length = 1
    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:281)
    at java.base/java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:815)
    at org.nhooo.example.io.NonAsciiValidation.main(NonAsciiValidation.java:23)