【问题标题】:Encoding UFT16 Emoji returns invalid bytes编码 UFT16 表情符号返回无效字节
【发布时间】:2022-02-10 22:51:26
【问题描述】:

我正在尝试在 dart 中编码一个 Unicode 字符,但这会导致无效的字节数组。

角色:??????

字节:[FF, FE, 3D, D8, 25, DD]

字符串用 BOM 编码。解码此字符串后,我可以看到字符串已正确解析,从而可以在我的 IDE 中看到表情符号。

然后我尝试再次对字符串进行编码,但这给了我一个字节数组,我不明白:

[FF、FE、FD、FF、FD、FF]

我正在使用包utf_convert对字符串进行编码:

import 'package:utf_convert/utf_convert.dart' as utf;

List<int> convert(String input) {
  return utf.encodeUtf16le(input, true).cast<int>();
}

这是这个包中的一个错误,还是我在这里监督了什么?

编辑1

我写了一些简单的测试来捕捉问题:

void main() {
  var emojiString = '????';
  var emojiBytes = <int>[0xFF, 0xFE, 0x3D, 0xD8, 0x25, 0xDD];

  test('Decode Emoji', () {
    var emoji = utf.decodeUtf16le(emojiBytes);

    expect(emoji, emojiString);
  });

  test('Encode Emoji', () {
    var bytes = utf.encodeUtf16le(emojiString, true).cast<int>();

    expect(bytes, emojiBytes);
  });
}

“Decode Emoji”函数成功,但第二个“Encode Emoji”函数因断言而失败:

预期:[255, 254, 61, 216, 37, 221] 实际:[255, 254, 253, 255, 253, 255]

【问题讨论】:

  • 我有一些问题要理解你在做什么。通常我们使用 unicode 作为十六进制序列。在您的结果中,您有 BOM + 替换字符 + 替换字符。但是为什么一个字节(输入)是 516?这似乎超出了范围,或者您使用了一个奇怪的符号。核实。 (并以十六进制写数字)
  • 516 是输入错误,是 216。我已将字符更改为十六进制代码以便更好地阅读
  • 字节:[FF, FE, 3D, D8, 25, DD] 是 (in Utf16le)) - `` (U+FEFF, 零宽度无间断空格 (BOM)) - `` (U+D83D, 非私人使用高代理) - `` (U+DD25, 低代理)。代理对是一种在 UTF-16 中对高于 BMP 的代码点进行编码的方法:???? (U+1F525, FIRE (0xd83d,0xdd25))。
  • 检查输出。我认为现在您错误地将第二个 253 替换为 FE。有什么奇怪的;您的输出包含一个 BOM,但文档很高 utf.encodeUtf16le 不应添加 BOM。 (删除le 以获取BOM。只是为了确定,您能否举一个完整的示例:定义input,使用您的函数并打印输出。可能对其中一个步骤有错误的假设
  • 字节 FF, FE, 3D, D8, 25, DD 来自哪里?它们与您的问题有什么关系?它们已经是 UTF-16 编码火表情符号(加上 BOM),除了每个 16 位代码单元被分解为每个 2 个字节。 encodeUtf16le 只会摧毁它。

标签: flutter dart parsing unicode utf-16


【解决方案1】:

所以在做了很多研究之后,我认为这是这个库中的一个错误。找到的代码是一个已停产包的分支here

我现在所做的解决方案是使用其他一些代码,它仍然存在于 dart 库中。我在this SO 帖子中找到了提示。

然后我自己实现了一个新库,其他面临相同问题的人也可以使用它。我在GitHubpub.dev 上托管了它,并获得了 MIT 许可。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 2016-10-09
    • 1970-01-01
    • 2022-07-09
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多