使用http客户端发起网络请求时接收emoji乱码如何正确解码
问题根因
你遇到的乱码是Dart http包默认解码规则导致的:当响应头Content-Type未明确指定charset=utf-8时,http包会默认使用Latin-1(ISO-8859-1)编码解析响应内容,emoji属于多字节Unicode字符,用Latin-1解析就会出现你看到的乱码字符。
修复方案
分两种常用处理方式:
1. 手动指定UTF-8解码(最稳妥,无需依赖服务端配置)
不要直接读取response.body,改为对响应字节流手动用UTF-8解码:
import 'dart:convert'; import 'package:http/http.dart' as http; // 发起请求示例 final response = await http.get(Uri.parse('你的API接口地址')); // 替换原直接读取body的逻辑,手动解码字节流 String responseContent = utf8.decode(response.bodyBytes); // 此时responseContent中emoji可正常显示
2. 自动解码(需要服务端配合)
- 发起请求时在请求头中添加
Accept-Charset: utf-8,告知服务端优先返回UTF-8编码的内容 - 要求服务端在响应头的
Content-Type字段中明确标注charset=utf-8,例如Content-Type: application/json; charset=utf-8
配置完成后http包会自动识别编码,直接读取response.body即可正常显示emoji。
发送请求注意事项
如果是你主动发送带emoji的请求,也需要在请求头明确标注编码,避免服务端接收乱码:
final response = await http.post( Uri.parse('你的API接口地址'), headers: { 'Content-Type': 'application/json; charset=utf-8', }, body: jsonEncode({'content': '😚☺😚☺🤑🤑🤑'}), );
内容的提问来源于stack exchange,提问作者svprdga
相关产品推荐
相关产品推荐

