【问题标题】:Emoji and accent encoding in dart/flutter飞镖/颤振中的表情符号和重音编码
【发布时间】:2020-08-12 16:38:07
【问题描述】:

我从我的 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)

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

【问题讨论】:

  • 你看过:pub.dev/packages/characters 吗?
  • 另外,apiText 在您的代码中是什么类型? toString() 并没有真正意义,然后尝试将 codeUnits 解析为 UTF-8,因为来自 String 的 codeUnits 在 Dart 中是 UTF-16。
  • @julemand101 是字符串类型,我编辑了问题以显示类型
  • 好的,所以apiText 确实包含您发布的带有反斜杠的文本?
  • @julemand101 是的,我从 api ""à é à ó ú ü ñ \uD83D\uDE00\uD83D\uDE03\uD83D\uDE04\uD83D\uDE01\uD83D\uDE06 得到这个文本\uD83D\uDE05" " 但是 "à é à ó ú ü ñ " 实际上是带有重音符号 "Á é í ó ú ñ" 的字符,所以我对它们进行编码以获得实际文本,但在此过程中表情符号 ( "\uD83D\uDE00\uD83D ... ") 杀死编码。该 api 可以发送任何带有拉丁字符和表情符号的文本(它是一个评论系统,这就是我得到的,用户 cmets)

标签: flutter dart


【解决方案1】:

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

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

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

好吧,它似乎很可能无法识别字符集,因此默认为 latin1,这解释了您的响应是如何搞砸的。

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

【讨论】:

  • 在争吵了大约几个小时后,终于看到了这个救生员!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2019-06-26
  • 2021-09-09
  • 2020-08-12
  • 2020-12-25
  • 2020-11-05
相关资源
最近更新 更多