uni-app 剪贴板无内置长度限制,实际受限于系统隐性上限(如安卓厂商ROM截断)、输入控件maxlength约束、H5的HTTPS/事件触发限制及零宽字符污染。

uni-app 本身对剪贴板内容**没有内置长度限制**,真正起作用的是各平台系统级限制或你绑定的输入控件约束——别怪 uni.getClipboardData 或 uni.setClipboardData,它们只是“搬运工”,不拦内容。
App 和小程序端:系统剪贴板无显式长度上限,但有隐性风险
Android/iOS 系统、微信/支付宝小程序的剪贴板底层通常支持数 MB 级文本(鸿蒙文档标称默认上限 128MB),实际中极少触达。但要注意:
- 超长字符串(如 >500KB)在部分安卓厂商 ROM(华为 EMUI、小米 MIUI)上可能被静默截断或读取失败,
uni.getClipboardData返回空或不进回调 - 微信小程序对 Emoji 处理不稳定,建议提前用
data.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, '□')统一占位再操作 - App 端若用 Native.js 手动调用原生 API,需注意字符串编码——未指定 UTF-8 时老机型可能按 ISO-8859-1 解析,导致中文乱码或截断
input/textarea 的 maxlength 是真限制,且和剪贴板无关
你复制了 1000 字,但 <input :maxlength="50"> 绑定后只显示前 50 个字符,这不是剪贴板问题,是 DOM 控件的强制约束行为:
-
maxlength按 Unicode 字符数计,中英文、Emoji 都算 1 个(但微信对 Emoji 计数异常,需预处理) - 别依赖
v-model自动截断:Vue 响应式更新可能滞后,input元素实际值已超限,而 data 还没同步,后续逻辑易误判 - 赋值前必须手动校验:
if (data.length > this.maxLen) { data = data.slice(0, this.maxLen); } - 赋值后加
this.$nextTick(() => this.$refs.input.setSelectionRange(0, data.length)),避免 iOS Safari 光标跳末尾却显示不全
H5 端:浏览器策略比长度更致命
H5 根本不走 uni.getClipboardData,它直接返回空;用 navigator.clipboard 时,长度不是瓶颈,但以下三点会直接卡死:
- HTTPS 或
localhost是硬门槛,http://192.168.x.x调试也会抛NotAllowedError - 必须用户点击事件第一层触发,包一层
setTimeout或Promise.then就失效 - 旧版安卓 WebView(如 QQ 浏览器)根本不认
navigator.clipboard,得 fallback 到textarea.select() + document.execCommand('copy'),且漏掉textarea.setSelectionRange(0, txt.length)在 iPhone 上大概率复制空串
真正容易被忽略的点是:零宽字符污染。微信/钉钉转发口令常带 \u200b、\u202a 等不可见符号,trim() 完全无效,看着像空字符串,实则 data.length > 0。清理必须显式匹配:data.replace(/[\u200b-\u200f\u202a-\u202f\uFEFF]/g, ''),否则长度校验和 UI 提示都会失准。


















