如何在Flutter应用程序中翻译字符串中的特殊字符?示例:“Déjà Vu”到“Déjà Vu”

问题描述 投票:0回答:2

我是 Flutter 开发的新手,我正在尝试解码或翻译特殊字符。 我正在使用的示例看起来像这样在 flutter 中以普通文本形式呈现:

Example: "Déjà Vu" to "Déjà Vu"

左边是它在 UI 上的显示方式,右边是我想要看到的结果。

我尝试通过文档使用

Runes
类 --> https://api.dart.dev/stable/1.24.3/dart-core/Runes-class.html 但没有运气。

这是非工作代码:

child: Text(new Runes("Déjà Vu").string)

更新:我尝试在 API 调用中传递

'Content-type': 'application/json; charset=utf-8',
,但它似乎并没有解决这个特定问题。我将附上响应的快照(我使用新标头运行它,也没有

这是代码:

   Future<http.Response> _attemptCall(String suffix) => http.get(
        '$kBaseURL$suffix',
        headers: {
          'Authorization': 'Bearer $_accessToken',
          'Content-type': 'application/json; charset=utf-8',
        },
      );

  Future<T> _authorizedCall<T>(
    String suffix,
    T Function(String) decode,
  ) async {
    if (_accessToken == '') {
      await refreshToken();
    }
    http.Response response = await _attemptCall(suffix);

    var resBody = response.body;
    print('This is the response --> $resBody');
    if (response.statusCode == 401) {
      await refreshToken();
      response = await _attemptCall(suffix);
    }

    if (response.statusCode == 200) {
      return decode(response.body);
    }
    return null;
  }

  @override
  Future<Episode> getEpisodeDetails(String id) => _authorizedCall(
        _episodeDetailUrl(id),
        (s) => Episode.fromJson(jsonDecode(s)),
      );
flutter dart special-characters
2个回答
4
投票

这种字符集修改称为 Mojibake(感谢 Randal Schwartz 指出!)

您无法将“Déjà Vu”改回“Déjà Vu”,您必须对数据编码和发送方式或解码响应的方式采取行动。

查看这些 utf-8 字符的二进制表示:

11000011 10000011 Ã   --> there is no way to tell `Ã` that it should be `à`
11000010 10101001 ©

11000011 10100000 à
11000011 10101001 é

您需要使用 API 响应修复上游问题:

Content-type: application/json; charset=utf-8

API 正在向您发送回字节流,并且应该是 utf8 以避免这种输出。

或者解码字节流的方式,你也可以改变:

return decode(response.body)

return decode(utf8.decode(response.bodyBytes));

0
投票

来自 Flutter 的请求调用如下所示:

final response = await http.get(url, headers: {
    'Content-Type': 'application/json; charset=utf-8',
    'Accept': 'application/json',
    'Authorization': 'Bearer ${globals.postillaToken}',
  }).timeout(Duration(seconds: 5));
return Map<String, dynamic> data = json.decode(response.body);

API 本身如下所示:

return Response({
        'status': True,
        'message': 'Get all UserDayOff from user',
        'data': serializer.data
    }, status=status.HTTP_200_OK, content_type='application/json; charset=utf-8')

定义了双方的编码解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.