JavaScript策略编写说明

由于JavaScript语言自身的限制(JavaScript语言内置字符串仅支持ASCII与UTF-16编码,为避免数据丢失),当遇到无法编码的字符串时将返回ArrayBuffer类型。优宽量化平台的所有API接口中,可以传入字符串参数的地方均支持传入ArrayBuffer类型。

以下示例说明了这一特性:

function stringToHex(str) {
    let hex = '';
    for (let i = 0; i < str.length; i++) {
        const charCode = str.charCodeAt(i).toString(16);
        hex += charCode.length === 1 ? '0' + charCode : charCode;
    }
    return hex;
}

function main() {
    const inputString = "abc\uD842\uDFB7123";  // 该"\uD842\uDFB7"字符的Unicode码点超出了16位范围
    // const inputString = "abcG123"; // 如果使用abcG123字符串测试,则变量outputD不会被赋值为ArrayBuffer

    // 使用Encode函数将inputString编码为十六进制格式
    const encodedHex = Encode("raw", "string", "hex", inputString);
    Log(encodedHex);  // 内容为:61 62 63 f0a0aeb7 31 32 33

    // 使用自定义的stringToHex函数编码,由于无法正确处理"\uD842\uDFB7"字符,导致十六进制编码错误
    const manuallyEncodedHex = stringToHex(inputString);
    Log(manuallyEncodedHex);  // 内容为:61 62 63 d842dfb7 31 32 33

    // 成功从十六进制编码还原为字符串(变量inputString)
    const decodedString = Encode("raw", "hex", "string", encodedHex);
    Log(decodedString);

    // 无法正确解码,返回ArrayBuffer类型,即变量outputD为ArrayBuffer
    const outputD = Encode("raw", "hex", "string", manuallyEncodedHex);
    Log(outputD);

    // 验证返回的ArrayBuffer类型变量outputD
    const bufferD = new Uint8Array(outputD);
    let hexBufferD = '';
    for (let i = 0; i < bufferD.length; i++) {
        hexBufferD += bufferD[i].toString(16).padStart(2, '0');
    }
    Log(hexBufferD);    // 61 62 63 d842dfb7 31 32 33
}