You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:30:15