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

如何在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包:

  1. 在项目的pubspec.yaml中添加依赖:
dependencies:
  charset_converter: ^2.0.0

执行dart pub get安装依赖。

  1. 读取文件字节并解码:

示例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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:41:07