控制台输入下标字符丢失问题:输入₂为何变为普通数字2?
问题
简言之,运行以下代码片段时:
Scanner scanner = new Scanner(System.in); String text = scanner.nextLine(); // 输入₂ System.out.println(text); // 输出2,而非₂
当输入下标数字(如₂)时,text实际值为2,不带有下标格式。
测试验证
我针对常见原因进行了排查:
是打印问题吗?
直接对比字符串结果仍不正确:
Scanner scanner = new Scanner(System.in); String text = scanner.nextLine(); // 输入₂ System.out.println(text.equals("₂")); // false System.out.println(text.equals("2")); // true
是Scanner的问题吗?
若输入为字符串形式,Scanner可正确处理:
Scanner scanner = new Scanner("₂"); String text = scanner.nextLine(); System.out.println(text); // 输出₂
是System.in的问题吗?
完全移除Scanner后问题仍存在:
byte[] data = System.in.readAllBytes(); // 输入₂ String text = new String(data, StandardCharsets.UTF_8).trim(); System.out.println(text); // 输出2,而非₂
是编码问题吗?
这并非通用Unicode/编码问题,输入其他字符(如🤔)可正常读取:
Scanner scanner = new Scanner(System.in); String text = scanner.nextLine(); // 输入🤔 System.out.println(text); // 输出🤔
推测
下标字符似乎在控制台输入到System.in的过程中丢失,甚至可能未到达Java程序。
这可能是我不了解的控制台特有特性?我在VSC和Windows CMD(Java 18)中均测试过该问题。
内容的提问来源于stack exchange,提问作者Zabuzard
相关产品推荐
相关产品推荐

