Flutter http.Response获取特殊字符出现乱码问题求助
问题原因
这是字符编码解析不匹配导致的乱码:服务器返回的内容是UTF-8编码,但http.Response.fromStream默认可能错误地使用单字节编码(比如ISO-8859-1)解析多字节的UTF-8字符,把UTF-8的每个字节单独当成一个字符处理,就出现了类似£、’这类乱码(比如£的UTF-8是两个字节0xC2 0xA3,用ISO-8859-1解析会拆成Â和£两个字符)。
解决方法
跳过http.Response.fromStream的默认解析逻辑,直接读取响应字节流并手动用UTF-8解码:
import 'package:http/http.dart' as http; import 'dart:convert'; var streamedResponse = await request.send(); // 读取响应的全部字节 var bytes = await streamedResponse.stream.toBytes(); // 用UTF-8解码字节为字符串 var responseBody = utf8.decode(bytes);
如果需要保留完整的Response对象(比如获取状态码、响应头),可以手动构建:
import 'package:http/http.dart' as http; import 'dart:convert'; var streamedResponse = await request.send(); var bytes = await streamedResponse.stream.toBytes(); var response = http.Response.bytes( bytes, streamedResponse.statusCode, headers: streamedResponse.headers, request: streamedResponse.request, ); // 此时response.body为正确解析的UTF-8字符串
额外建议:检查服务器响应头的Content-Type是否包含charset=utf-8。如果服务器未返回该字段,客户端会默认使用单字节编码解析。若有权限修改服务器配置,建议在响应头明确指定Content-Type: text/plain; charset=utf-8(根据实际内容类型调整),从根源避免解析错误。
内容的提问来源于stack exchange,提问作者Leong
相关产品推荐
相关产品推荐

