报错
{"code":"PARAM_ERROR","detail":{"location":"body","value":129},"message":"输入源“/body/description”映射到值字段“商品描述”字符串规则校验失败,字节数 129,大于最大值 127"}
这里 129 是一个动态的数字,表示提交的字节数。
尝试解决
对 description 字符串进行截取
description = substringByBytes(description, 127);
定义
function substringByBytes(str, n) {
let bytes = 0;
for (let i = 0; i < str.length; i++) {
// 获取当前字符的字节长度
const byteLen = str.charCodeAt(i) > 255 ? 2 : 1;
// 如果当前字符的字节长度加上已经累计的字节数大于 n,则直接返回截取的字符串
if (bytes + byteLen > n) {
return str.slice(0, i);
}
bytes += byteLen;
}
return str;
}
然而报错相同的错误。
原来微信支付可能是将汉字视为 3 个字节。
修复
重新定义 substringByBytes
,最终的代码为
function substringByBytes(str, n) {
let bytes = 0;
for (let i = 0; i < str.length; i++) {
// 获取当前字符的字节长度
const byteLen = str.charCodeAt(i) > 255 ? 3 : 1;
// 如果当前字符的字节长度加上已经累计的字节数大于 n,则直接返回截取的字符串
if (bytes + byteLen > n) {
return str.slice(0, i);
}
bytes += byteLen;
}
return str;
}
是不是可能跟字符串编码有关系呢?比如
在UTF-8编码下,一个中文字符占3个字节;而使用GBK编码时一个中文字符占2个字节
参考
- https://blog.csdn.net/u013107634/article/details/104848502
- https://blog.csdn.net/weixin_39732534/article/details/110743346
- https://cloud.tencent.com/developer/article/1691166