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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:32:52