飞镖/颤振中的表情符号和重音编码

时间:2020-08-12 16:38:07

标签: flutter dart

我从api中获得了下一个字符串

"à é í ó ú ü ñ \uD83D\uDE00\uD83D\uDE03\uD83D\uDE04\uD83D\uDE01\uD83D\uDE06\uD83D\uDE05"

来自json格式的响应

{
    'apiText': "à é í ó ú ü ñ \uD83D\uDE00\uD83D\uDE03\uD83D\uDE04\uD83D\uDE01\uD83D\uDE06\uD83D\uDE05",
    'otherInfo': 'etc.',
    .
    .
    .
}

它包含不正确编码的重音符号à é í ó ú ü ñ,并且包含表情符号\uD83D\uDE00\uD83D\uDE03\uD83D\uDE04\uD83D\uDE01\uD83D\uDE06\uD83D\uDE05

到目前为止,我已经尝试过

var json = jsonDecode(response.body)
String apiText = json['apiText'];
List<int> bytes = apiText.codeUnits;
comentario = utf8.decode(bytes);

但产生一个

[ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: FormatException: Invalid UTF-8 byte (at offset 21)

如何获得带有重音符号和表情符号的正确文本?

1 个答案:

答案 0 :(得分:0)

基于您称为response.body的事实,我假设您使用的http包在body对象上确实具有Response属性。

您应该在文档中注意以下细节:

使用charset标头字段的Content-Type参数从bodyBytes进行转换(如果有)。如果不可用或编码名称未知,则默认使用latin1(根据RFC 2616)。

好吧,它很可能无法弄清楚字符集,因此默认为latin1,它解释了您的响应是如何弄乱的。

一个解决方案是使用resonse.bodyBytes代替,它包含响应中的原始字节。然后,您可以使用手动解析utf8.decode(resonse.bodyBytes),如果您确定应将响应解析为UTF-8。