首页 > 解决方案 > 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

标签: dartutf-8utf-16

解决方案


这根本不是一个好主意,base64Encode(data.codeUnits)因为base64Encode编码bytesdata.codeUnits不一定是 bytes 。它们在这里(因为字符串的所有字符都有低于 256 的代码点,它们甚至是 ASCII。)

以前ut8.encode用过base64Encode就好了。它适用于所有字符串。

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

在这里,您使用base64Encode(data.codeUnits)which 只有在data字符串仅包含最多 255 个代码单元时才有效。因此,如果您假设,则意味着可以使用latin1.decode或来完成解码String.fromCharCodes。如果字符串仅包含 ASCII(它在此处执行,但不保证成功) ,则使用ascii.decodeand也有效。utf8.decodebase64Encode

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


推荐阅读