Dart 中的 codeUnits 属性 与 utf8.encode 函数

codeUnits property vs utf8.encode function in Dart

我有这个小代码:

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,则使用 ascii.decodeutf8.decode 也有效(它在此处执行此操作,但 base64Encode 后继不能保证)。

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

我试过了

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

得到这个

use “smart” symbols like ‘ this’

“和”是来自iOS键盘的智能字符