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
相关产品推荐
相关产品推荐

