根本原因是小程序url解析器遇到未编码的&、=、空格、中文等字符会提前截断query string,导致json.parse抛syntaxerror;必须对每个query value单独encodeuricomponent,接收时用decodeuricomponent+json.parse并加try/catch兜底。

uni.navigateTo 传参含 &、空格、中文时页面白屏或报 SyntaxError
根本原因是小程序 URL 解析器遇到未编码的 &、=、空格、中文等字符,会提前截断 query string,导致 options 拿到的是不完整字符串,JSON.parse() 直接抛 SyntaxError: Unexpected end of JSON input。
常见错误现象包括:控制台无报错但页面空白、onLoad 中 options 是空对象、JSON.parse 报错、参数值缺失(如只拿到 name=张 后半截丢了)。
- 必须对整个 query value 做
encodeURIComponent,不是只 encode 中文——&和=同样危险 - 不要对整个 URL 调用
encodeURIComponent,它会把/、:也编码,导致路径失效 - 推荐写法:
url: `/pages/detail/detail?data=${encodeURIComponent(JSON.stringify(obj))}` - 如果参数是多个独立字段(如
id=123&name=张三),应分别编码每个 value:id=123&name=${encodeURIComponent('张三')}
接收页 decodeURIComponent 后再 JSON.parse 安全性不足?
单纯 decodeURIComponent(options.data) + JSON.parse 在某些边界场景仍可能失败——比如原始字符串里有未转义的双引号或反斜杠,JSON.stringify 生成的字符串本身若没被正确处理,解码后仍是非法 JSON。
更稳妥的做法是加一层 try/catch 并 fallback:
onLoad(options) {
try {
const raw = decodeURIComponent(options.data || '');
const obj = JSON.parse(raw);
this.dataObj = obj;
} catch (e) {
console.error('参数解析失败', e, options.data);
this.dataObj = {};
}
}
- 永远不要假设
options.data一定存在或非空,真机环境下可能因网络/跳转异常为空字符串 -
JSON.stringify对 undefined、function、symbol 字段会静默忽略,传参前需确保数据可序列化 - 若参数体积较大(> 2KB),微信小程序 URL 长度限制可能触发截断,此时应改用
uni.setStorageSync+ 路由传 key
图片路径作为参数传递时显示乱码或 404
当把 /static/avatar.png 这类路径当参数传,真机常出现乱码或请求 404,本质还是 URI 编码缺失——路径里的空格、括号、中文在 URL 中必须被编码,否则小程序底层直接丢弃后续内容。
- 错误写法:
url: `/pages/img/img?path=/static/我的头像.png` - 正确写法:
url: `/pages/img/img?path=${encodeURIComponent('/static/我的头像.png')}` - 接收页必须用
decodeURIComponent(options.path),不能只靠options.path直接赋值给<image src=""></image> - 更优方案:静态资源尽量用根相对路径硬编码;动态图优先走
uni.downloadFile+uni.getFileInfo获取本地临时路径,避免 URL 传路径
为什么 H5 正常、开发者工具正常,但真机就出错
因为微信开发者工具的 URL 解析逻辑比真机宽松,会自动容错处理部分未编码字符;而真机(尤其 iOS 微信)严格遵循 RFC 3986,任何未编码的特殊字符都会导致 query 解析中断。
- 测试必须扫码真机验证,不能只依赖模拟器
- 所有涉及
uni.navigateTo、uni.redirectTo、uni.reLaunch的跳转,只要带参数,一律默认需要encodeURIComponent - 服务端返回的跳转链接(如短信内嵌链接)也需确保已做 URL 编码,前端不再二次 encode
最易被忽略的一点:encodeURIComponent 不处理 / 和 :,所以它只适合编码 query value,绝不能用于编码整个 URL 或路径段。路径合法性要靠命名规范(static 目录仅用英文、数字、下划线)+ 编码 value 双保险。











