123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- function byteLength (string) {
- let length = 0
- for (let i = 0, n = string.length; i < n; i++) {
- const code = string.charCodeAt(i)
- if (code >= 0xd800 && code <= 0xdbff && i + 1 < n) {
- const code = string.charCodeAt(i + 1)
- if (code >= 0xdc00 && code <= 0xdfff) {
- length += 4
- i++
- continue
- }
- }
- if (code <= 0x7f) length += 1
- else if (code <= 0x7ff) length += 2
- else length += 3
- }
- return length
- }
- let toString
- if (typeof TextDecoder !== 'undefined') {
- const decoder = new TextDecoder()
- toString = function toString (buffer) {
- return decoder.decode(buffer)
- }
- } else {
- toString = function toString (buffer) {
- const len = buffer.byteLength
- let output = ''
- let i = 0
- while (i < len) {
- let byte = buffer[i]
- if (byte <= 0x7f) {
- output += String.fromCharCode(byte)
- i++
- continue
- }
- let bytesNeeded = 0
- let codePoint = 0
- if (byte <= 0xdf) {
- bytesNeeded = 1
- codePoint = byte & 0x1f
- } else if (byte <= 0xef) {
- bytesNeeded = 2
- codePoint = byte & 0x0f
- } else if (byte <= 0xf4) {
- bytesNeeded = 3
- codePoint = byte & 0x07
- }
- if (len - i - bytesNeeded > 0) {
- let k = 0
- while (k < bytesNeeded) {
- byte = buffer[i + k + 1]
- codePoint = (codePoint << 6) | (byte & 0x3f)
- k += 1
- }
- } else {
- codePoint = 0xfffd
- bytesNeeded = len - i
- }
- output += String.fromCodePoint(codePoint)
- i += bytesNeeded + 1
- }
- return output
- }
- }
- let write
- if (typeof TextEncoder !== 'undefined') {
- const encoder = new TextEncoder()
- write = function write (buffer, string, offset = 0, length = byteLength(string)) {
- const len = Math.min(length, buffer.byteLength - offset)
- encoder.encodeInto(string, buffer.subarray(offset, offset + len))
- return len
- }
- } else {
- write = function write (buffer, string, offset = 0, length = byteLength(string)) {
- const len = Math.min(length, buffer.byteLength - offset)
- buffer = buffer.subarray(offset, offset + len)
- let i = 0
- let j = 0
- while (i < string.length) {
- const code = string.codePointAt(i)
- if (code <= 0x7f) {
- buffer[j++] = code
- i++
- continue
- }
- let count = 0
- let bits = 0
- if (code <= 0x7ff) {
- count = 6
- bits = 0xc0
- } else if (code <= 0xffff) {
- count = 12
- bits = 0xe0
- } else if (code <= 0x1fffff) {
- count = 18
- bits = 0xf0
- }
- buffer[j++] = bits | (code >> count)
- count -= 6
- while (count >= 0) {
- buffer[j++] = 0x80 | ((code >> count) & 0x3f)
- count -= 6
- }
- i += code >= 0x10000 ? 2 : 1
- }
- return len
- }
- }
- module.exports = {
- byteLength,
- toString,
- write
- }
|