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

How to translate special characters in a string in a Flutter application? Example: "Déjà Vu" to "Déjà Vu"

我是 Flutter 开发的新手,我正在尝试解码或 t运行slate 特殊字符。 我正在使用的示例看起来像这样在 flutter 中显示为普通文本:

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

左边是 UI 上的样子,右边是我想看的结果。

我已经尝试通过文档使用 Runes class --> https://api.dart.dev/stable/1.24.3/dart-core/Runes-class.html 但没有成功。

这是 non-working 代码:

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

更新:我试图在 API 调用中传递 'Content-type': 'application/json; charset=utf-8',,但它似乎没有解决这个特定问题。我将附上响应的快照(我 运行 它有新的 headers 也没有

代码如下:

   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)),
      );

这个字符集重整称为 Mojibake(感谢 Randal Schwartz 指出!)

您无法将“似曾相识”改回“似曾相识”,您必须对数据的编码和发送方式或解码响应的方式采取措施。

查看这些 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));