42 lines
1.6 KiB
TypeScript
42 lines
1.6 KiB
TypeScript
/* eslint no-bitwise: 0 */
|
|
|
|
/**
|
|
* taken from punycode@2.1.0
|
|
*
|
|
* Creates an array containing the numeric code points of each Unicode
|
|
* character in the string. While JavaScript uses UCS-2 internally,
|
|
* this function will convert a pair of surrogate halves (each of which
|
|
* UCS-2 exposes as separate characters) into a single code point,
|
|
* matching UTF-16.
|
|
* @see `punycode.ucs2.encode`
|
|
* @see <https://mathiasbynens.be/notes/javascript-encoding>
|
|
* @memberOf punycode.ucs2
|
|
* @name decode
|
|
* @param string The Unicode input string (UCS-2).
|
|
* @returns The new array of code points.
|
|
*/
|
|
export default function ucs2decode(string: string): string[] {
|
|
const output = [];
|
|
let counter = 0;
|
|
const length = string.length;
|
|
while (counter < length) {
|
|
const value = string.charCodeAt(counter++);
|
|
if (value >= 0xd800 && value <= 0xdbff && counter < length) {
|
|
// It's a high surrogate, and there is a next character.
|
|
const extra = string.charCodeAt(counter++);
|
|
// eslint-disable-next-line eqeqeq
|
|
if ((extra & 0xfc00) == 0xdc00) {
|
|
// Low surrogate.
|
|
output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);
|
|
} else {
|
|
// It's an unmatched surrogate; only append this code unit, in case the
|
|
// next code unit is the high surrogate of a surrogate pair.
|
|
output.push(value);
|
|
counter--;
|
|
}
|
|
} else {
|
|
output.push(value);
|
|
}
|
|
}
|
|
return output as unknown as string[];
|
|
}
|