如何在Dart中正确读取并转换ANSI编码文件为字符串?
在Windows下用Dart正确读取ANSI编码文本文件的方法
Windows系统的ANSI编码并非统一标准,它对应系统默认的代码页(比如中文简体是CP936/GBK,西欧语言是CP1252),而Dart默认以UTF-8读取文件,直接读取会导致重音符号、特殊字符显示乱码。以下是解决方法:
步骤1:确定目标文件的ANSI编码类型
- 若知道文件对应的代码页(比如中文文件用GBK),可直接跳过此步骤。
- 不确定的话,打开Windows命令提示符,输入
chcp命令,输出的数字就是当前系统的ANSI代码页(例如Active code page: 936对应GBK)。
步骤2:使用第三方字符集转换包解码
Dart标准库不支持Windows专属代码页的解码,需要借助charset_converter包:
- 在项目的
pubspec.yaml中添加依赖:
dependencies: charset_converter: ^2.0.0
执行dart pub get安装依赖。
- 读取文件字节并解码:
示例1:指定固定编码(如GBK)
import 'dart:io'; import 'package:charset_converter/charset_converter.dart'; void main() async { // 读取文件原始字节 final fileBytes = await File('target_file.txt').readAsBytes(); // 用GBK编码解码字节为字符串 final content = await CharsetConverter.decode('GBK', fileBytes); print(content); }
示例2:动态适配系统ANSI编码
如果需要适配当前系统的默认ANSI编码,可以通过命令行获取代码页并映射到对应字符集:
import 'dart:io'; import 'package:charset_converter/charset_converter.dart'; // 获取系统默认ANSI对应的字符集名称 Future<String> getSystemAnsiCharset() async { final processResult = await Process.run('chcp', []); final codePage = processResult.stdout.toString().split(':').last.trim(); // 常见代码页与字符集映射,可根据需求扩展 switch(codePage) { case '936': return 'GBK'; case '1252': return 'Windows-1252'; case '1251': return 'Windows-1251'; case '950': return 'Big5'; default: throw Exception('不支持的代码页:$codePage'); } } void main() async { try { final charset = await getSystemAnsiCharset(); final fileBytes = await File('target_file.txt').readAsBytes(); final content = await CharsetConverter.decode(charset, fileBytes); print(content); } catch (e) { print('读取失败:$e'); } }
注意事项
- 不要使用Dart默认的
readAsString()方法,它默认以UTF-8解码,会导致ANSI编码的特殊字符乱码。 - 若文件是特定编码(而非系统默认ANSI),直接指定对应的字符集名称即可,无需动态获取系统代码页。
内容的提问来源于stack exchange,提问作者Vinícius Bruno
相关产品推荐
相关产品推荐

