dart - Dart 中的 codeUnits 属性与 utf8.encode 函数
问题描述
我有这个小代码:
void main(List<String> args) {
const data = 'amigo+/=:chesu';
var encoded = base64Encode(utf8.encode(data));
var encoded2 = base64Encode(data.codeUnits);
var decoded = utf8.decode(base64Decode(encoded));
var decoded2 = utf8.decode(base64Decode(encoded2));
print(encoded);
print(encoded2);
print(decoded);
print(decoded2);
}
输出是:
YW1pZ28rLz06Y2hlc3U=
YW1pZ28rLz06Y2hlc3U=
amigo+/=:chesu
amigo+/=:chesu
codeUnits
属性给出了一个不可修改的 UTF-16 代码单元列表,可以使用utf8.decode
函数吗?或者应该使用什么功能encoded2
?
解决方案
这根本不是一个好主意,base64Encode(data.codeUnits)
因为base64Encode
编码bytes,data.codeUnits
不一定是 bytes 。它们在这里(因为字符串的所有字符都有低于 256 的代码点,它们甚至是 ASCII。)
以前ut8.encode
用过base64Encode
就好了。它适用于所有字符串。
从UTF-16 代码单元转换为 a 的最佳方法String
是String.fromCharCodes
.
在这里,您使用base64Encode(data.codeUnits)
which 只有在data
字符串仅包含最多 255 个代码单元时才有效。因此,如果您假设,则意味着可以使用latin1.decode
或来完成解码String.fromCharCodes
。如果字符串仅包含 ASCII(它在此处执行,但不保证成功) ,则使用ascii.decode
and也有效。utf8.decode
base64Encode
简而言之,不要这样做base64Encode(data.codeUnits)
。在执行之前将字符串转换为字节base64Encode
,然后使用反向转换将字节转换回字符串。
推荐阅读
- beautifulsoup - select.one 在 bs4 中没有给出想要的输出
- jenkins - 用声纳设置詹金斯时出错
- sql - SQL 查询在同一查询中查找值、日期和公司之间的最小值和最大值
- python - 合并两个排序的链表 - Python 实现 - 错误/不完整的输出
- pygame - 无法在pycharm中安装pygame
- matrix - Z = -1 处图像平面的逆相机内在矩阵
- c - createIndexes 中的错误:无法使用数据库“mydb”发送“createIndexes”命令:无法读取 4 个字节:套接字错误或超时
- html - 如何让一个 div 作为一个盒子不跨越/离开屏幕
- django - 在这种情况下发布多种形式的同一模型的最佳方式是什么?
- vbscript - 循环一行不断增加的代码