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

Flutter中如何修复API返回字符串UTF-8解码乱码问题

问题原因

这是典型的响应编码不匹配问题:接口返回的内容实际为UTF-8编码,但客户端解析响应字节流时,错误使用了Latin-1(ISO-8859-1)/Windows-1252编码解码,最终将原本UTF-8编码的短横/破折号(对应字节序列0xE2 0x80 0x93)解析为乱码â。
大部分场景下这个问题的触发原因是:服务端接口没有在响应头里正确返回Content-Type: text/plain; charset=utf-8这类编码声明,Dart的HTTP请求库默认会fallback到Latin-1编码解码响应,直接导致乱码。

修复方案

方案1:从解析根源修正(推荐)

不要依赖HTTP库自动根据响应头选择解码规则,拿到原始响应字节后强制用UTF-8解码即可。

  • 如果你使用官方http包:
    不要直接读取response.body属性,改用response.bodyBytes拿到原始字节后手动解码:
    import 'dart:convert';
    import 'package:http/http.dart' as http;
    
    final resp = await http.get(apiUri);
    // 强制UTF-8解码,避免编码自动识别错误
    final correctStr = utf8.decode(resp.bodyBytes);
    
  • 如果你使用dio库:
    在请求配置中将responseType设为ResponseType.bytes,拿到响应字节后统一用utf8.decode()处理;也可以配置全局响应拦截器,在拦截器中统一完成字节到UTF-8字符串的转换,不需要每个接口单独处理。

方案2:已有乱码字符串兜底修复

如果已经拿到了乱码字符串、无法重新发起请求修正解码逻辑,可以先把乱码字符串按Latin-1编码转回原始字节,再重新用UTF-8解码还原内容:

import 'dart:convert';
import 'dart:convert' show latin1;

String garbled = "replace the cable if a fault is found â for example";
// 转回原始字节后重新按UTF-8解码,allowMalformed用于兼容部分损坏的字节序列避免抛错
String fixed = utf8.decode(latin1.encode(garbled), allowMalformed: true);

内容的提问来源于stack exchange,提问作者Adhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:42:09