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

Flutter解析后端返回Unicode转义字符不生效问题解决方案

问题根源

你之前尝试的三种UTF-8解码方案全部无效,核心原因是问题不在编码转换环节:后端返回内容里的\u25CF、\u2019这类序列是字面量文本(即字符串中实际存储的是反斜杠、字母u、4位十六进制数字共6个字符),而非JSON标准中定义的Unicode转义字符。
你当前代码直接取网络框架自动解析后的response.data,框架的自动解析逻辑没有正确处理这类转义序列,才会导致转义字符原样保留在字符串中。

修复方案

按优先级选以下任意一种方案即可:

  • 方案一:从JSON解析环节修复(推荐)
    关闭网络框架的自动JSON解析,拿到原始响应文本后用Dart官方dart:convert库的jsonDecode手动解析,官方解析器可以正确识别标准Unicode转义序列。
    代码示例(以Dio网络库为例):
    import 'dart:convert';
    
    // 网络请求时指定响应类型为纯文本,跳过框架自动解析
    final response = await dio.get(
      requestUrl,
      options: Options(responseType: ResponseType.plain),
    );
    
    if (response.statusCode == 200) {
      // 手动执行JSON解析
      Map<String, dynamic> postResponse = jsonDecode(response.data);
      var postsJson = postResponse["posts"];
      for (var postObject in postsJson) {
        Map<String, dynamic> finalMap = Map<String, dynamic>.from(postObject);
        Post p = Post.fromMap(finalMap);
        posts.add(p);
      }
    }
    
  • 方案二:手动转换残留转义字符(适合无法修改解析逻辑的场景)
    如果已经拿到了带字面量Unicode转义的字符串,可以写正则匹配所有\uXXXX格式的序列,手动转成对应字符:
    /// 解析字符串中字面量形式的\uXXXX Unicode转义序列
    String decodeUnicodeEscapes(String rawText) {
      return rawText.replaceAllMapped(
        RegExp(r'\\u([0-9a-fA-F]{4})'),
        (match) {
          final charCode = int.parse(match.group(1)!, radix: 16);
          return String.fromCharCode(charCode);
        },
      );
    }
    
    // 使用示例
    String correctText = decodeUnicodeEscapes("The Chat service we\\u2019ve been paying for since our launch");
    // 转换结果:The Chat service we’ve been paying for since our launch
    String dotText = decodeUnicodeEscapes("\\u25CF\\u25CF\\u25CF");
    // 转换结果:●●●
    
注意事项
  • 不要对已经是正确编码的字符串重复做UTF-8解码,会导致字符乱码
  • 如果遇到超过4位的Unicode编码(比如emoji字符),可以把正则调整为同时匹配大括号包裹的扩展Unicode格式即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:39:26