codeUnits属性与Dart中的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编码字节,而data.codeUnits不一定是字节。它们在这里(因为字符串的所有字符都有低于256的代码点,所以它们甚至是ASCII。(

base64Encode之前使用ut8.encode是好的。它适用于所有字符串。

UTF-16代码单元转换为String的最佳方法是String.fromCharCodes

这里您使用的是base64Encode(data.codeUnits),它仅在data字符串仅包含255以下的代码单元时才有效。因此,如果假设,那么这意味着可以使用latin1.decodeString.fromCharCodes进行解码。如果字符串只包含ASCII(这里是这样做的,但base64Encode后续不能保证(,则使用ascii.decodeutf8.decode也可以。

简而言之,不要做base64Encode(data.codeUnits)。在执行base64Encode之前,将字符串转换为字节,然后使用反向转换将字节转换回字符串。

我试过这个

print(utf8.decode('use âsmartâ symbols like â thisâ'.codeUnits));

得到了这个

use “smart” symbols like ‘ this’

"one_answers"是iOS键盘中的智能字符

最新更新