Uint8Array thành chuỗi trong Javascript


122

Tôi có một số dữ liệu được mã hóa UTF-8 nằm trong một loạt các phần tử Uint8Array trong Javascript. Có cách nào hiệu quả để giải mã những thứ này thành một chuỗi javascript thông thường (tôi tin rằng Javascript sử dụng 16 bit Unicode) không? Tôi không muốn thêm một ký tự tại thời điểm này vì việc ghép chuỗi sẽ trở nên tốn nhiều CPU.


Không chắc liệu nó có hoạt động hay không, nhưng tôi sử dụng u8array.toString()khi đọc các tệp từ BrowserFS làm lộ đối tượng Uint8Array khi bạn gọi fs.readFile.
jcubic

1
@jcubic cho tôi, toStringkhi Uint8Arraytrả về các số được phân tách bằng dấu phẩy, chẳng hạn như "91,50,48,49,57,45"(Chrome 79)
kolen

Câu trả lời:


171

TextEncoderTextDecodertừ tiêu chuẩn Mã hóa , được làm đầy bởi thư viện mã chuỗi, chuyển đổi giữa các chuỗi và Bộ đệm mảng :

var uint8array = new TextEncoder("utf-8").encode("¢");
var string = new TextDecoder("utf-8").decode(uint8array);

39
Đối với bất kỳ ai lười biếng như tôi npm install text-encoding, var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;. Không, cám ơn.
Evan Hu

16
hãy cẩn thận các thư viện văn bản mã hóa NPM, webpack bó phân tích cho thấy thư viện là HUGE
wayofthefuture

3
@VincentScheib Các trình duyệt đã xóa hỗ trợ cho bất kỳ định dạng nào khác ngoại trừ utf-8. Vì vậy, TextEncodertranh luận là không cần thiết!
chuyến đi

1
nodejs.org/api/string_decoder.html từ ví dụ: const {StringDecoder} = request ('string_decoder'); const decoder = new StringDecoder ('utf8'); const cent = Buffer.from ([0xC2, 0xA2]); console.log (decoder.write (cent));
giám tuyển

4
Lưu ý rằng Node.js đã thêm TextEncoder/ TextDecoderAPI vào v11, vì vậy không cần cài đặt thêm bất kỳ gói nào nếu bạn chỉ nhắm mục tiêu các phiên bản Node hiện tại.
Loilo

42

Điều này sẽ hoạt động:

// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt

/* utf.js - UTF-8 <=> UTF-16 convertion
 *
 * Copyright (C) 1999 Masanao Izumo <iz@onicos.co.jp>
 * Version: 1.0
 * LastModified: Dec 25 1999
 * This library is free.  You can redistribute it and/or modify it.
 */

function Utf8ArrayToStr(array) {
    var out, i, len, c;
    var char2, char3;

    out = "";
    len = array.length;
    i = 0;
    while(i < len) {
    c = array[i++];
    switch(c >> 4)
    { 
      case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
        // 0xxxxxxx
        out += String.fromCharCode(c);
        break;
      case 12: case 13:
        // 110x xxxx   10xx xxxx
        char2 = array[i++];
        out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
        break;
      case 14:
        // 1110 xxxx  10xx xxxx  10xx xxxx
        char2 = array[i++];
        char3 = array[i++];
        out += String.fromCharCode(((c & 0x0F) << 12) |
                       ((char2 & 0x3F) << 6) |
                       ((char3 & 0x3F) << 0));
        break;
    }
    }

    return out;
}

Nó có phần gọn gàng hơn các giải pháp khác vì nó không sử dụng bất kỳ bản hack nào cũng như không phụ thuộc vào các chức năng của Browser JS, ví dụ như hoạt động cũng trong các môi trường JS khác.

Kiểm tra bản demo JSFiddle .

Cũng xem các câu hỏi liên quan: đâyđây


6
Điều này có vẻ hơi chậm. Nhưng đoạn mã duy nhất trong vũ trụ mà tôi thấy có hiệu quả. Tìm thấy tốt + áp dụng!
Redsandro

6
Tôi không hiểu tại sao điều này không có nhiều lượt ủng hộ hơn. Có vẻ rất hợp lý khi xoay qua quy ước UTF-8 cho các đoạn trích nhỏ. Async Blob + Filereader hoạt động tốt cho các văn bản lớn như những người khác đã chỉ ra.
DanHorner

2
Câu hỏi đặt ra là làm thế nào để làm điều này mà không cần dây nối
Jack Wester

5
Các công trình lớn, ngoại trừ nó không xử lý 4+ chuỗi byte, ví dụ như fromUTF8Array([240,159,154,133])hóa ra rỗng (trong khi fromUTF8Array([226,152,131])→"☃")
unhammer

1
Tại sao các trường hợp 8, ​​9, 10 và 11 bị loại trừ? Bất kỳ lý do cụ thể nào? Và trường hợp 15 cũng được phải không? 15 (1111) sẽ biểu thị 4 byte được sử dụng, phải không?
RaR

31

Đây là những gì tôi sử dụng:

var str = String.fromCharCode.apply(null, uint8Arr);

7
Từ tài liệu , điều này dường như không giải mã UTF8.
Albert

29
Điều này sẽ xuất hiện RangeErrortrên các văn bản lớn hơn. "Đã vượt quá kích thước ngăn xếp cuộc gọi tối đa"
Redsandro

1
Nếu bạn đang chuyển đổi Uint8Arrays lớn thành chuỗi nhị phân và nhận được RangeError, hãy xem hàm Uint8ToString từ stackoverflow.com/a/12713326/471341 .
yonran

IE 11 ném SCRIPT28: Out of stack spacekhi tôi nạp 300 + k ký tự hoặc RangeErrorcho Chrome 39. Firefox 33 vẫn ổn. 100 + k chạy ok với cả ba.
Sheepy

Điều này không tạo ra kết quả chính xác từ các ký tự unicode mẫu trên en.wikipedia.org/wiki/UTF-8 . ví dụ: String.fromCharCode.apply (null, new Uint8Array ([0xc2, 0xa2])) không tạo ra ¢.
Vincent Scheib,

16

Được tìm thấy trong một trong các ứng dụng mẫu của Chrome, mặc dù điều này dành cho các khối dữ liệu lớn hơn mà bạn không sao với chuyển đổi không đồng bộ.

/**
 * Converts an array buffer to a string
 *
 * @private
 * @param {ArrayBuffer} buf The buffer to convert
 * @param {Function} callback The function to call when conversion is complete
 */
function _arrayBufferToString(buf, callback) {
  var bb = new Blob([new Uint8Array(buf)]);
  var f = new FileReader();
  f.onload = function(e) {
    callback(e.target.result);
  };
  f.readAsText(bb);
}

2
Như bạn đã nói, điều này sẽ hoạt động kém hiệu quả trừ khi bộ đệm để chuyển đổi thực sự rất lớn. Cuộc hội thoại UTF-8 to wchar đồng bộ của một chuỗi đơn giản (giả sử 10-40 byte) được triển khai trong V8 nên nhỏ hơn nhiều micro giây trong khi tôi đoán rằng mã của bạn sẽ yêu cầu gấp hàng trăm lần. Cảm ơn vì tất cả.
Jack Wester

15

Trong Node "các Buffertrường hợp cũng là các Uint8Arraytrường hợp ", vì vậy buf.toString()hoạt động trong trường hợp này.


Làm việc tuyệt vời cho tôi. Và thật đơn giản! Nhưng thực tế Uint8Array có phương thức toString ().
diệt vong

Đơn giản và thanh lịch, không nhận thức Bufferđược cũng là Uint8Array. Cảm ơn!
LeOn - Han Li 21/10/18

1
@doom Về phía trình duyệt, Uint8Array.toString () sẽ không biên dịch chuỗi utf-8, nó sẽ liệt kê các giá trị số trong mảng. Vì vậy, nếu những gì bạn có là một Uint8Array từ một nguồn mà không xảy ra cũng là một vùng đệm, bạn sẽ cần phải tạo ra một để làm điều kỳ diệu:Buffer.from(uint8array).toString('utf-8')
Joachim Lous

12

Giải pháp do Albert đưa ra hoạt động tốt miễn là hàm đã cung cấp được gọi không thường xuyên và chỉ được sử dụng cho các mảng có kích thước khiêm tốn, nếu không, nó rất kém hiệu quả. Đây là một giải pháp JavaScript vani nâng cao hoạt động cho cả Node và trình duyệt và có những ưu điểm sau:

• Hoạt động hiệu quả cho tất cả các kích thước mảng octet

• Không tạo ra các chuỗi bỏ đi trung gian

• Hỗ trợ các ký tự 4 byte trên các công cụ JS hiện đại (nếu không thì "?" Được thay thế)

var utf8ArrayToStr = (function () {
    var charCache = new Array(128);  // Preallocate the cache for the common single byte chars
    var charFromCodePt = String.fromCodePoint || String.fromCharCode;
    var result = [];

    return function (array) {
        var codePt, byte1;
        var buffLen = array.length;

        result.length = 0;

        for (var i = 0; i < buffLen;) {
            byte1 = array[i++];

            if (byte1 <= 0x7F) {
                codePt = byte1;
            } else if (byte1 <= 0xDF) {
                codePt = ((byte1 & 0x1F) << 6) | (array[i++] & 0x3F);
            } else if (byte1 <= 0xEF) {
                codePt = ((byte1 & 0x0F) << 12) | ((array[i++] & 0x3F) << 6) | (array[i++] & 0x3F);
            } else if (String.fromCodePoint) {
                codePt = ((byte1 & 0x07) << 18) | ((array[i++] & 0x3F) << 12) | ((array[i++] & 0x3F) << 6) | (array[i++] & 0x3F);
            } else {
                codePt = 63;    // Cannot convert four byte code points, so use "?" instead
                i += 3;
            }

            result.push(charCache[codePt] || (charCache[codePt] = charFromCodePt(codePt)));
        }

        return result.join('');
    };
})();

2
Giải pháp tốt nhất ở đây, vì nó cũng xử lý các ký tự 4 byte (ví dụ: biểu tượng cảm xúc) Cảm ơn bạn!
fiffy

1
và nghịch đảo của điều này là gì?
simbo1905

6

Thực hiện những gì @Sudhir đã nói, sau đó để lấy Chuỗi ra khỏi danh sách các số được phân tách bằng dấu phẩy, hãy sử dụng:

for (var i=0; i<unitArr.byteLength; i++) {
            myString += String.fromCharCode(unitArr[i])
        }

Điều này sẽ cung cấp cho bạn chuỗi bạn muốn, nếu nó vẫn có liên quan


Xin lỗi, đã không nhận thấy gửi cuối cùng mà bạn nói rằng bạn không muốn thêm một ký tự cùng một lúc. Tuy nhiên, hy vọng điều này sẽ giúp những người khác không gặp vấn đề với việc sử dụng CPU.
shuki

14
Điều này không giải mã UTF8.
Albert

Thậm chí ngắn hơn: String.fromCharCode.apply(null, unitArr);. Như đã đề cập, nó không xử lý mã hóa UTF8, nhưng đôi khi điều này đủ đơn giản nếu bạn chỉ cần hỗ trợ ASCII nhưng không có quyền truy cập vào TextEncoder / TextDecoder.
Ravenstine

Câu trả lời đề cập đến @Sudhir nhưng tôi đã tìm kiếm trên trang và tìm thấy câu trả lời như vậy. Vì vậy, sẽ tốt hơn nếu viết nội tuyến bất cứ điều gì anh ấy nói
Joakim

Điều này sẽ có hiệu suất khủng khiếp trên dây dài hơn. Không sử dụng toán tử + trên chuỗi.
Tối đa

3

Nếu bạn không thể sử dụng API TextDecodernó không được hỗ trợ trên IE :

  1. Bạn có thể sử dụng polyfill FastestSmallestTextEncoderDecoder do trang web Mạng nhà phát triển Mozilla đề xuất ;
  2. Bạn có thể sử dụng chức năng này cũng được cung cấp tại trang web MDN :

function utf8ArrayToString(aBytes) {
    var sView = "";
    
    for (var nPart, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {
        nPart = aBytes[nIdx];
        
        sView += String.fromCharCode(
            nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
                /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */
                (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
                (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
                (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
                (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
            : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
                (nPart - 192 << 6) + aBytes[++nIdx] - 128
            : /* nPart < 127 ? */ /* one byte */
                nPart
        );
    }
    
    return sView;
}

let str = utf8ArrayToString([50,72,226,130,130,32,43,32,79,226,130,130,32,226,135,140,32,50,72,226,130,130,79]);

// Must show 2H₂ + O₂ ⇌ 2H₂O
console.log(str);


2

Hãy thử các chức năng này,

var JsonToArray = function(json)
{
    var str = JSON.stringify(json, null, 0);
    var ret = new Uint8Array(str.length);
    for (var i = 0; i < str.length; i++) {
        ret[i] = str.charCodeAt(i);
    }
    return ret
};

var binArrayToJson = function(binArray)
{
    var str = "";
    for (var i = 0; i < binArray.length; i++) {
        str += String.fromCharCode(parseInt(binArray[i]));
    }
    return JSON.parse(str)
}

source: https://gist.github.com/tomfa/706d10fed78c497731ac , kudos to Tomfa


2

Tôi rất thất vọng khi thấy mọi người không chỉ ra cách thực hiện cả hai cách hoặc cho thấy rằng mọi thứ hoạt động trên các chuỗi UTF8 không tầm thường. Tôi tìm thấy một bài đăng trên codereview.stackexchange.com có một số mã hoạt động tốt. Tôi đã sử dụng nó để biến rune cổ đại thành byte, để kiểm tra một số mã hóa trên byte, sau đó chuyển đổi mọi thứ trở lại thành một chuỗi. Mã làm việc trên github ở đây . Tôi đã đổi tên các phương thức cho rõ ràng:

// https://codereview.stackexchange.com/a/3589/75693
function bytesToSring(bytes) {
    var chars = [];
    for(var i = 0, n = bytes.length; i < n;) {
        chars.push(((bytes[i++] & 0xff) << 8) | (bytes[i++] & 0xff));
    }
    return String.fromCharCode.apply(null, chars);
}

// https://codereview.stackexchange.com/a/3589/75693
function stringToBytes(str) {
    var bytes = [];
    for(var i = 0, n = str.length; i < n; i++) {
        var char = str.charCodeAt(i);
        bytes.push(char >>> 8, char & 0xFF);
    }
    return bytes;
}

Bài kiểm tra đơn vị sử dụng chuỗi UTF-8 này:

    // http://kermitproject.org/utf8.html
    // From the Anglo-Saxon Rune Poem (Rune version) 
    const secretUtf8 = `ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ
ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ᛬`;

Lưu ý rằng độ dài chuỗi chỉ là 117 ký tự nhưng độ dài byte, khi được mã hóa, là 234.

Nếu tôi bỏ ghi chú các dòng console.log, tôi có thể thấy rằng chuỗi được giải mã là cùng một chuỗi đã được mã hóa (với các byte được chuyển qua thuật toán chia sẻ bí mật của Shamir!):

kiểm tra đơn vị mà mã hóa và giải mã demo


String.fromCharCode.apply(null, chars)sẽ lỗi nếu charsquá lớn.
Marc J. Schmidt,

1

Trong NodeJS, chúng tôi có sẵn Bộ đệm và việc chuyển đổi chuỗi ký tự với chúng thực sự dễ dàng. Tốt hơn, thật dễ dàng để chuyển đổi Uint8Array thành Buffer. Hãy thử mã này, nó hoạt động với tôi trong Node về cơ bản cho bất kỳ chuyển đổi nào liên quan đến Uint8Arrays:

let str = Buffer.from(uint8arr.buffer).toString();

Chúng tôi chỉ giải nén ArrayBuffer từ Uint8Array và sau đó chuyển đổi nó thành Bộ đệm NodeJS thích hợp. Sau đó, chúng tôi chuyển đổi Bộ đệm thành một chuỗi (bạn có thể chuyển sang mã hóa hex hoặc base64 nếu bạn muốn).

Nếu chúng ta muốn chuyển đổi trở lại Uint8Array từ một chuỗi, thì chúng ta sẽ làm điều này:

let uint8arr = new Uint8Array(Buffer.from(str));

Lưu ý rằng nếu bạn khai báo một mã hóa như base64 khi chuyển đổi thành một chuỗi, thì bạn phải sử dụng Buffer.from(str, "base64")nếu bạn đã sử dụng base64 hoặc bất kỳ mã hóa nào khác mà bạn đã sử dụng.

Điều này sẽ không hoạt động trong trình duyệt mà không có mô-đun! Bộ đệm NodeJS không tồn tại trong trình duyệt, vì vậy phương pháp này sẽ không hoạt động trừ khi bạn thêm chức năng Bộ đệm vào trình duyệt. Điều đó thực sự khá dễ thực hiện, chỉ cần sử dụng một mô-đun như thế này , vừa nhỏ vừa nhanh!


0
class UTF8{
static encode(str:string){return new UTF8().encode(str)}
static decode(data:Uint8Array){return new UTF8().decode(data)}

private EOF_byte:number = -1;
private EOF_code_point:number = -1;
private encoderError(code_point) {
    console.error("UTF8 encoderError",code_point)
}
private decoderError(fatal, opt_code_point?):number {
    if (fatal) console.error("UTF8 decoderError",opt_code_point)
    return opt_code_point || 0xFFFD;
}
private inRange(a:number, min:number, max:number) {
    return min <= a && a <= max;
}
private div(n:number, d:number) {
    return Math.floor(n / d);
}
private stringToCodePoints(string:string) {
    /** @type {Array.<number>} */
    let cps = [];
    // Based on http://www.w3.org/TR/WebIDL/#idl-DOMString
    let i = 0, n = string.length;
    while (i < string.length) {
        let c = string.charCodeAt(i);
        if (!this.inRange(c, 0xD800, 0xDFFF)) {
            cps.push(c);
        } else if (this.inRange(c, 0xDC00, 0xDFFF)) {
            cps.push(0xFFFD);
        } else { // (inRange(c, 0xD800, 0xDBFF))
            if (i == n - 1) {
                cps.push(0xFFFD);
            } else {
                let d = string.charCodeAt(i + 1);
                if (this.inRange(d, 0xDC00, 0xDFFF)) {
                    let a = c & 0x3FF;
                    let b = d & 0x3FF;
                    i += 1;
                    cps.push(0x10000 + (a << 10) + b);
                } else {
                    cps.push(0xFFFD);
                }
            }
        }
        i += 1;
    }
    return cps;
}

private encode(str:string):Uint8Array {
    let pos:number = 0;
    let codePoints = this.stringToCodePoints(str);
    let outputBytes = [];

    while (codePoints.length > pos) {
        let code_point:number = codePoints[pos++];

        if (this.inRange(code_point, 0xD800, 0xDFFF)) {
            this.encoderError(code_point);
        }
        else if (this.inRange(code_point, 0x0000, 0x007f)) {
            outputBytes.push(code_point);
        } else {
            let count = 0, offset = 0;
            if (this.inRange(code_point, 0x0080, 0x07FF)) {
                count = 1;
                offset = 0xC0;
            } else if (this.inRange(code_point, 0x0800, 0xFFFF)) {
                count = 2;
                offset = 0xE0;
            } else if (this.inRange(code_point, 0x10000, 0x10FFFF)) {
                count = 3;
                offset = 0xF0;
            }

            outputBytes.push(this.div(code_point, Math.pow(64, count)) + offset);

            while (count > 0) {
                let temp = this.div(code_point, Math.pow(64, count - 1));
                outputBytes.push(0x80 + (temp % 64));
                count -= 1;
            }
        }
    }
    return new Uint8Array(outputBytes);
}

private decode(data:Uint8Array):string {
    let fatal:boolean = false;
    let pos:number = 0;
    let result:string = "";
    let code_point:number;
    let utf8_code_point = 0;
    let utf8_bytes_needed = 0;
    let utf8_bytes_seen = 0;
    let utf8_lower_boundary = 0;

    while (data.length > pos) {
        let _byte = data[pos++];

        if (_byte == this.EOF_byte) {
            if (utf8_bytes_needed != 0) {
                code_point = this.decoderError(fatal);
            } else {
                code_point = this.EOF_code_point;
            }
        } else {
            if (utf8_bytes_needed == 0) {
                if (this.inRange(_byte, 0x00, 0x7F)) {
                    code_point = _byte;
                } else {
                    if (this.inRange(_byte, 0xC2, 0xDF)) {
                        utf8_bytes_needed = 1;
                        utf8_lower_boundary = 0x80;
                        utf8_code_point = _byte - 0xC0;
                    } else if (this.inRange(_byte, 0xE0, 0xEF)) {
                        utf8_bytes_needed = 2;
                        utf8_lower_boundary = 0x800;
                        utf8_code_point = _byte - 0xE0;
                    } else if (this.inRange(_byte, 0xF0, 0xF4)) {
                        utf8_bytes_needed = 3;
                        utf8_lower_boundary = 0x10000;
                        utf8_code_point = _byte - 0xF0;
                    } else {
                        this.decoderError(fatal);
                    }
                    utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed);
                    code_point = null;
                }
            } else if (!this.inRange(_byte, 0x80, 0xBF)) {
                utf8_code_point = 0;
                utf8_bytes_needed = 0;
                utf8_bytes_seen = 0;
                utf8_lower_boundary = 0;
                pos--;
                code_point = this.decoderError(fatal, _byte);
            } else {
                utf8_bytes_seen += 1;
                utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen);

                if (utf8_bytes_seen !== utf8_bytes_needed) {
                    code_point = null;
                } else {
                    let cp = utf8_code_point;
                    let lower_boundary = utf8_lower_boundary;
                    utf8_code_point = 0;
                    utf8_bytes_needed = 0;
                    utf8_bytes_seen = 0;
                    utf8_lower_boundary = 0;
                    if (this.inRange(cp, lower_boundary, 0x10FFFF) && !this.inRange(cp, 0xD800, 0xDFFF)) {
                        code_point = cp;
                    } else {
                        code_point = this.decoderError(fatal, _byte);
                    }
                }

            }
        }
        //Decode string
        if (code_point !== null && code_point !== this.EOF_code_point) {
            if (code_point <= 0xFFFF) {
                if (code_point > 0)result += String.fromCharCode(code_point);
            } else {
                code_point -= 0x10000;
                result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff));
                result += String.fromCharCode(0xDC00 + (code_point & 0x3ff));
            }
        }
    }
    return result;
}

`


Thêm một số mô tả để trả lời. @terran
Rohit Poudel

-3

Tôi đang sử dụng đoạn mã Typecript này:

function UInt8ArrayToString(uInt8Array: Uint8Array): string
{
    var s: string = "[";
    for(var i: number = 0; i < uInt8Array.byteLength; i++)
    {
        if( i > 0 )
            s += ", ";
        s += uInt8Array[i];
    }
    s += "]";
    return s;
}

Loại bỏ các chú thích loại nếu bạn cần phiên bản JavaScript. Hi vọng điêu nay co ich!


3
OP yêu cầu không thêm một ký tự tại một thời điểm. Ngoài ra, anh ta không muốn hiển thị nó dưới dạng biểu diễn chuỗi của danh sách mà chỉ là một chuỗi. Ngoài ra, điều này không chuyển đổi các ký tự thành chuỗi nhưng hiển thị số của nó.
Albert
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.