使用Java Scanner类时如何获取UTF-8字符或禁用UTF-8输入?
解决Java Scanner读取UTF-8字符的问题
咱们先理清问题根源:默认情况下,Scanner会采用当前系统的默认字符编码,不一定是UTF-8,所以当输入包含UTF-8特殊字符时,就会出现读取出错或者乱码的情况。下面分两种需求给你对应的解决方案:
一、让Scanner正确读取UTF-8字符
你需要显式指定Scanner的字符编码为UTF-8,这里不能直接用System.in,得把它包装成InputStreamReader并指定编码。代码示例如下:
import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class Main { public static void main(String[] args) { // 显式指定UTF-8编码创建Scanner Scanner sc = new Scanner(new InputStreamReader(System.in, StandardCharsets.UTF_8)); System.out.println(sc.nextLine()); } }
这样修改后,不管系统默认编码是什么,Scanner都会以UTF-8解析输入,就能正确读取中文、日文或其他UTF-8特殊字符了。另外要注意,如果是在IDE里运行,记得把控制台编码也设置成UTF-8(一般在IDE设置里搜"encoding"就能找到),不然可能出现输出乱码的情况。
二、设置Scanner不接收UTF-8字符(仅保留ASCII字符)
如果你的需求是只接受ASCII范围内(0-127)的字符,排除非ASCII的UTF-8字符,可以用两种方式实现:
- 方式1:读取后过滤内容
先读取完整输入,再过滤掉ASCII范围外的字符:
Scanner sc = new Scanner(System.in); String input = sc.nextLine(); // 只保留ASCII字符,其余字符直接移除 String filteredInput = input.replaceAll("[^\\x00-\\x7F]", ""); System.out.println(filteredInput);
- 方式2:指定ASCII编码创建Scanner
直接让Scanner用ASCII编码读取,非ASCII的UTF-8字符会被替换为问号或直接忽略(具体表现取决于系统处理逻辑):
import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(new InputStreamReader(System.in, StandardCharsets.US_ASCII)); System.out.println(sc.nextLine()); } }
内容的提问来源于stack exchange,提问作者kien vu
相关产品推荐
相关产品推荐

