【发布时间】: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