Dart中stdin.readLineSync()输入异常:仅奇数长度字符可触发返回
Dart Windows环境下stdin.readLineSync()输入异常问题解决
问题现象
在Windows控制台或PowerShell中使用Dart SDK 3.2.1稳定版时,调用stdin.readLineSync()会出现以下异常:
- 输入偶数长度字符按回车后,方法无法返回,必须再次输入内容才会触发返回;
- 输入奇数长度字符按回车后,方法返回,但结果会拼接前一次未被读取的输入内容。
测试代码如下:
import "dart:io"; void main() { print('Type something and press enter:'); String? result = stdin.readLineSync(); print(result); }
实际运行示例:
C:\Users\kmort\projects>first.exe Type something and press enter: even number of characters. // 输入的偶数长度字符 odd item count. // 输入的奇数长度字符 odd item count.characters. // 返回结果为两次输入的拼接
问题根源
这是Dart SDK在Windows平台的控制台编码兼容bug:Windows默认控制台使用OEM编码(如CP437),而Dart的stdin.readLineSync()默认以UTF-8编码读取输入。编码不匹配导致字节读取计数错误,无法正确识别换行符,进而出现输入异常。
解决办法
方法1:指定控制台编码读取输入
修改代码,将readLineSync的编码参数设为Windows控制台当前使用的编码(通常为CP437):
import "dart:io"; import "dart:convert"; void main() { print('Type something and press enter:'); String? result = stdin.readLineSync(encoding: Encoding.getEncoding('cp437')); print(result); }
方法2:切换控制台编码为UTF-8
在运行Dart程序前,先在控制台执行命令切换编码为UTF-8:
chcp 65001
之后再运行你的Dart程序,stdin.readLineSync()即可正常读取输入。
额外说明
该问题仅出现在Windows平台,Linux/macOS环境因默认使用UTF-8编码不会触发。后续可关注Dart SDK更新日志,官方可能会修复该兼容性问题。
内容的提问来源于stack exchange,提问作者kmort
相关产品推荐
相关产品推荐

