![](/img/trans.png)
[英]How to encode and decode Base64 and Base64Url in Flutter / Dart
[英]Do I need to manually remove the = padding from a Base64Url encoded string in Dart?
我很惊讶地注意到,当我在Dart中将字符串转换为Base64Url时,我得到了一个以=
填充字符结尾的字符串。
import 'dart:convert';
main() {
String credentials = "username:password";
String encoded = base64Url.encode(utf8.encode(credentials));
print(encoded); // dXNlcm5hbWU6cGFzc3dvcmQ=
}
我以为Base64Url的重点是删除URL中不好的字符。 显然不是。 该文档甚至列出了它。 那是否意味着我必须自己手动删除它?
final noPadding = encoded.replaceAll(RegExp('='), ''); // dXNlcm5hbWU6cGFzc3dvcmQ
base64url
的规范 (URL和文件名安全)仅分别用-
和_
替换普通base64
的第62个( +
)和第63个( /
)字符。 它不会替换填充字符( =
),而是发出以下语句:
填充字符“ =”在URI中使用时通常进行百分比编码,但是如果隐式知道数据长度,则可以通过跳过填充来避免这种情况。
尽管可以删除填充,但是您必须要小心,因为它不会自动处理,如果您不确定先使用normalize()
类的方法来还原填充,则解码方法将引发错误。
相反,我建议只使用Uri
类中可用的百分比编码,因为Dart base64实现已经自动支持百分比编码的字符串:
import 'dart:convert';
main() {
String input = 'username:password';
String encoded = Uri.encodeComponent(base64Url.encode(utf8.encode(input)));
print(encoded); // dXNlcm5hbWU6cGFzc3dvcmQ%3D
String decoded = utf8.decode(base64Url.decode(encoded));
print(decoded); // username:password
}
此外,如果将base64url
编码的字符串作为URL的一部分进行传递,则base64url
使用百分比编码,因为这是URL中的预期行为,并且保留了整个字符串,因此以后不必进行标准化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.