53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
/** 微信小程序基础库未内置 TextEncoder,qrcode 库依赖它编码 payload */
|
||
function installTextEncodingPolyfill() {
|
||
const root = (typeof globalThis !== 'undefined'
|
||
? globalThis
|
||
: typeof global !== 'undefined'
|
||
? global
|
||
: typeof wx !== 'undefined'
|
||
? wx
|
||
: {}) as typeof globalThis & { TextEncoder?: typeof TextEncoder };
|
||
|
||
if (typeof root.TextEncoder !== 'undefined') return;
|
||
|
||
class MiniTextEncoder implements TextEncoder {
|
||
readonly encoding = 'utf-8';
|
||
|
||
encode(input?: string): Uint8Array {
|
||
const str = input ?? '';
|
||
const bytes: number[] = [];
|
||
for (let i = 0; i < str.length; i++) {
|
||
let code = str.charCodeAt(i);
|
||
if (code < 0x80) {
|
||
bytes.push(code);
|
||
} else if (code < 0x800) {
|
||
bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
|
||
} else if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {
|
||
const next = str.charCodeAt(i + 1);
|
||
if (next >= 0xdc00 && next <= 0xdfff) {
|
||
i += 1;
|
||
code = 0x10000 + ((code - 0xd800) << 10) + (next - 0xdc00);
|
||
bytes.push(
|
||
0xf0 | (code >> 18),
|
||
0x80 | ((code >> 12) & 0x3f),
|
||
0x80 | ((code >> 6) & 0x3f),
|
||
0x80 | (code & 0x3f),
|
||
);
|
||
} else {
|
||
bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
|
||
}
|
||
} else {
|
||
bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
|
||
}
|
||
}
|
||
return new Uint8Array(bytes);
|
||
}
|
||
}
|
||
|
||
root.TextEncoder = MiniTextEncoder as unknown as typeof TextEncoder;
|
||
}
|
||
|
||
installTextEncodingPolyfill();
|
||
|
||
export {};
|