我有一个小代码:
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
编码字节,而data.codeUnits
不一定是字节。它们在这里(因为字符串的所有字符都有低于256的代码点,所以它们甚至是ASCII。(
在base64Encode
之前使用ut8.encode
是好的。它适用于所有字符串。
将从UTF-16代码单元转换为String
的最佳方法是String.fromCharCodes
。
这里您使用的是base64Encode(data.codeUnits)
,它仅在data
字符串仅包含255以下的代码单元时才有效。因此,如果假设,那么这意味着可以使用latin1.decode
或String.fromCharCodes
进行解码。如果字符串只包含ASCII(这里是这样做的,但base64Encode
后续不能保证(,则使用ascii.decode
和utf8.decode
也可以。
简而言之,不要做base64Encode(data.codeUnits)
。在执行base64Encode
之前,将字符串转换为字节,然后使用反向转换将字节转换回字符串。
我试过这个
print(utf8.decode('use âsmartâ symbols like â thisâ'.codeUnits));
得到了这个
use “smart” symbols like ‘ this’
"one_answers"是iOS键盘中的智能字符