1 votos

¿Cómo traducir caracteres especiales en una cadena en una aplicación de Flutter? Ejemplo: "Déjà Vu" a "Déjà Vu"

Soy nuevo en el desarrollo de Flutter y estoy tratando de decodificar o traducir caracteres especiales. El ejemplo con el que estoy trabajando se ve así presentado como texto normal en flutter:

Ejemplo: "Déjà Vu" a "Déjà Vu"

La izquierda es cómo aparece en la interfaz de usuario y el resultado que me gustaría ver está a la derecha.

He intentado usar la clase Runes a través de la documentación --> https://api.dart.dev/stable/1.24.3/dart-core/Runes-class.html pero sin suerte.

Este es el código que no funciona:

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

Actualización: Intenté pasar 'Content-type': 'application/json; charset=utf-8', en la llamada a la API, sin embargo, no parecía corregir este problema en particular. Adjuntaré una captura de pantalla de la respuesta (la ejecuté con las nuevas cabeceras y también sinentrar descripción de la imagen aquí)

Aquí está el código:

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

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

    var resBody = response.body;
    print('Esta es la respuesta --> $resBody');
    if (response.statusCode == 401) {
      await refreshToken();
      response = await _attemptCall(suffix);
    }

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

  @override
  Future getEpisodeDetails(String id) => _authorizedCall(
        _episodeDetailUrl(id),
        (s) => Episode.fromJson(jsonDecode(s)),
      );

1voto

421 Puntos 457

Este embrollo de caracteres se llama Mojibake (¡Gracias a Randal Schwartz por señalarlo!)

No puedes cambiar "Déjà Vu" a "Déjà Vu", debes tomar medidas en la forma en que los datos se codifican y envían o en la forma en que decodificas la respuesta.

Observa la representación binaria de estos caracteres utf-8:

11000011 10000011 Ã   --> no hay manera de indicarle a `Ã` que debería ser `à`
11000010 10101001 ©

11000011 10100000 à
11000011 10101001 é

Necesitas solucionar el problema aguas arriba ya sea con la respuesta de la API:

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

La API te está devolviendo un flujo de bytes, y debería ser utf8 para evitar este tipo de salida.

O en la forma en que decodificas el flujo de bytes, también puedes cambiar:

return decode(response.body)

a

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

0voto

cwhisperer Puntos 248

La llamada de solicitud desde Flutter se ve así:

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 data = json.decode(response.body);

La API en sí se ve así:

return Response({
        'status': True,
        'message': 'Obtener todos los días de descanso del usuario',
        'data': serializer.data
    }, status=status.HTTP_200_OK, content_type='application/json; charset=utf-8')

Haber definido la codificación en ambos lados resolvió mi problema.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X