如何修改JavaScript字符串字节计算代码以匹配Oracle lengthB结果
让JavaScript计算结果与Oracle的lengthB函数一致
差异原因
你的JavaScript代码通过Blob.size获取的是字符串标准UTF-8编码的字节数,而Oracle的lengthB函数(默认字符集为AL32UTF8时)会将Unicode补充平面字符(比如表情😊)拆分为UTF-16代理对,每个代理码元单独以UTF-8编码(每个占3字节)。例如:
- 表情😊(U+1F60A)在标准UTF-8中占4字节,但在Oracle AL32UTF8中会被拆分为两个UTF-16代理码元(0xD83D、0xDE0A),每个码元转UTF-8占3字节,总共6字节——这就是你的例子中结果差2字节的原因。
修正后的JavaScript代码
以下代码模拟Oracle AL32UTF8字符集下lengthB的计算逻辑:
const oracleLengthB = str => { let byteCount = 0; for (let i = 0; i < str.length; i++) { const code = str.charCodeAt(i); if (code <= 0x7F) { byteCount += 1; } else if (code <= 0x7FF) { byteCount += 2; } else { byteCount += 3; } } return byteCount; };
测试验证
调用oracleLengthB("Susan 002 UK ACM Testing 😊")会返回31,与Oracle的lengthB结果完全一致。
说明
该代码默认适配Oracle最常用的AL32UTF8字符集(Oracle的UTF8字符集本质是CESU-8,逻辑相同)。如果你的Oracle数据库使用其他字符集(如GBK、ISO-8859-1),则需要根据对应字符集的编码规则调整字节计算逻辑。
内容的提问来源于stack exchange,提问作者Indranil Mondal
相关产品推荐
相关产品推荐

