Flutter URI编解码问题:Firebase动态链接邮箱加号被替换为空格
Firebase动态链接密码重置:邮箱参数加号被转空格的问题解决
问题本质
这是URL编码规范的特性导致的:
- HTTP查询参数默认遵循
application/x-www-form-urlencoded格式,该规范里加号+会被解码为空格。Uri.parse()严格遵守这个规则,所以解析时会把test+abc@xyz.com里的+转成空格。 - 手动构建
Uri时,Dart的Uri构造器会自动对参数中的特殊字符(包括+)做URL编码——把+转换成%2B。当你调用queryParameters时,又会自动将%2B解码回+,所以结果符合预期。
解决方案
针对你的场景,有两种可行的处理方式:
1. 生成动态链接时提前编码邮箱参数
在生成密码重置链接前,对邮箱地址做URL编码,把+替换成%2B。用Dart的Uri.encodeComponent()即可实现:
String originalEmail = 'test+abc@xyz.com'; String encodedEmail = Uri.encodeComponent(originalEmail); // 用encodedEmail拼接动态链接,最终email参数会是test%2Babc@xyz.com
这样Uri.parse()解析时,会把%2B解码回+,得到正确的邮箱地址。
2. 解析时手动处理原始查询字符串
如果无法修改链接生成逻辑,可以直接解析原始查询字符串,绕过默认的加号解码规则:
void main() { var uri = Uri.parse("https://example.com/auth/resetPassword/?access_token=abcd&email=test+abc@xyz.com"); Map<String, String> params = {}; uri.query.split('&').forEach((param) { var keyValue = param.split('='); if (keyValue.length == 2) { String key = Uri.decodeComponent(keyValue[0]); // 先把加号替换成%2B,再解码 String value = Uri.decodeComponent(keyValue[1].replaceAll('+', '%2B')); params[key] = value; } }); print(params); // 输出: {access_token: abcd, email: test+abc@xyz.com} }
内容的提问来源于stack exchange,提问作者Pradip Sutariya
相关产品推荐
相关产品推荐

