जावास्क्रिप्ट में स्ट्रिंग के लिए Uint8Array


122

मेरे पास कुछ UTF-8 एन्कोडेड डेटा हैं जो जावास्क्रिप्ट में Uint8Array तत्वों की श्रेणी में रहते हैं। वहाँ एक नियमित जावास्क्रिप्ट स्ट्रिंग के लिए इन बाहर व्याख्या करने के लिए एक कुशल तरीका है (मेरा मानना ​​है कि जावास्क्रिप्ट 16 बिट यूनिकोड का उपयोग करता है)? मैं एक समय में एक चरित्र को जोड़ना नहीं चाहता क्योंकि स्ट्रिंग कंसर्नशन सीपीयू के लिए गहन हो जाएगा।


यकीन नहीं है कि यह काम करेगा, लेकिन u8array.toString()जब आप कॉल करते हैं तो मैं UFS8Array ऑब्जेक्ट को उजागर करने वाले BrowserFS से फाइल पढ़ते समय उपयोग करता हूं fs.readFile
जकुबिक १

1
मेरे लिए @jcubic, रिटर्न toStringपर Uint8Arrayअल्पविराम से अलग किए गए नंबर जैसे "91,50,48,49,57,45"(Chrome 79)
kolen

जवाबों:


171

TextEncoderऔर TextDecoderसे एन्कोडिंग मानक है, जिसके द्वारा polyfilled है stringencoding पुस्तकालय , तार और ArrayBuffers के बीच धर्मान्तरित:

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

40
किसी को भी मेरे जैसे आलसी के लिए, , ।npm install text-encoding var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;जी नहीं, धन्यवाद।
इवान हू

16
npm टेक्स्ट-एन्कोडिंग लाइब्रेरी से सावधान रहें, वेबपैक बंडल एनालाइज़र से पता चलता है कि लाइब्रेरी बहुत बड़ी है
Wayofthefuture

3
@VincentScheib ब्राउज़रों ने सिवाय किसी अन्य प्रारूप के समर्थन को हटा दिया utf-8। तो, TextEncoderतर्क अनावश्यक है!
त्रियुलसे

1
नोडज ..org/api/string_decoder.html उदाहरण से: const {StringDecoder} = की आवश्यकता ('string_decoder'); const डिकोडर = नया स्ट्रिंगरकोडर ('utf8'); const cent = Buffer.from ([0xC2, 0xA2]); console.log (decoder.write (प्रतिशत));
curist

4
ध्यान दें कि Node.js ने v11 में TextEncoder/ TextDecoderAPI को जोड़ा है , इसलिए यदि आप केवल वर्तमान नोड संस्करणों को लक्षित करते हैं तो किसी भी अतिरिक्त पैकेज को स्थापित करने की आवश्यकता नहीं है।
लीलो

42

यह काम करना चाहिए:

// 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;
}

यह अन्य समाधानों के रूप में कुछ हद तक क्लीनर है क्योंकि यह किसी भी हैक का उपयोग नहीं करता है और न ही ब्राउज़र जेएस कार्यों पर निर्भर करता है, उदाहरण के लिए अन्य जेएस वातावरण में भी काम करता है।

की जाँच करें JSFiddle डेमो

संबंधित प्रश्न भी देखें: यहां और यहां


6
यह थोड़े धीमा लगता है। लेकिन ब्रह्मांड में एकमात्र स्निपेट मुझे मिला जो काम करता है। अच्छी खोज + दत्तक!
Redsandro

6
मुझे समझ में नहीं आता कि यह अधिक upvotes क्यों नहीं है। यह छोटे स्निपेट के लिए UTF-8 सम्मेलन के माध्यम से क्रैंक करने के लिए उल्लेखनीय समझदार लगता है। Async Blob + Filereader बड़े पाठों के लिए बढ़िया काम करता है जैसा कि दूसरों ने संकेत दिया है।
दानहॉर्नर 21

2
सवाल यह था कि स्ट्रिंग कॉनटेनमेंट के बिना यह कैसे किया जाए
जैक वेस्टर

5
महान काम करता है, सिवाय इसके कि 4+ बाइट अनुक्रमों को नहीं संभालता है, उदाहरण के fromUTF8Array([240,159,154,133])लिए खाली निकल जाता है (जबकि fromUTF8Array([226,152,131])→"☃")
unhammer

1
8, 9, 10 और 11 के मामलों को बाहर क्यों रखा गया है? कोई खास वजह? और केस 15 भी संभव है, है ना? 15 (1111) निरूपित करेगा 4 बाइट्स का उपयोग किया जाता है, है ना?
आरएआर

31

यहाँ मेरा उपयोग है:

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

7
से डॉक , इस डिकोड UTF8 प्रतीत नहीं होता है।
अल्बर्ट

29
यह RangeErrorबड़े ग्रंथों पर फेंकेगा। "अधिकतम कॉल स्टैक आकार पार हो गया"
रेड्संड्रो

1
यदि आप बड़े Uint8Arrays को बाइनरी स्ट्रिंग्स में कनवर्ट कर रहे हैं और RangeError प्राप्त कर रहे हैं, तो stackoverflow.com/a/12713326/471341 से Uint8ToString फ़ंक्शन देखें ।
योनरान

IE 11 फेंकता है SCRIPT28: Out of stack spaceजब मैं इसे 300 + k चार्ट या RangeErrorक्रोम 39 के लिए फ़ीड करता हूं । फ़ायरफ़ॉक्स 33 ठीक है। 100 + के तीनों के साथ ठीक चलता है।
भेड़ नोवी

यह en.wikipedia.org/wiki/UTF-8 पर उदाहरण यूनिकोड वर्णों से सही परिणाम नहीं देता है । जैसे String.fromCharCode.apply (अशक्त, नया Uint8Array ([0xc2, 0xa2])) ¢ का उत्पादन नहीं करता है।
विंसेंट स्कीब

16

क्रोम नमूना अनुप्रयोगों में से एक में पाया गया, हालांकि यह डेटा के बड़े ब्लॉकों के लिए है जहां आप एक अतुल्यकालिक रूपांतरण के साथ ठीक हैं।

/**
 * 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
जैसा कि आपने कहा, यह बहुत अच्छा प्रदर्शन करेगा जब तक कि बफ़र कन्वर्ट करने के लिए वास्तव में बहुत बड़ा नहीं है। एक साधारण स्ट्रिंग (जैसे 10-40 बाइट्स) को बदलने के लिए सिंक्रोनस UTF-8 कहा जाता है, कहते हैं, V8 एक माइक्रोसेकंड से बहुत कम होना चाहिए, जबकि मुझे लगता है कि आपके कोड को एक सैकड़ों बार आवश्यकता होगी। धन्यवाद औश्र सबकुछ वही है।
जैक वेस्टर

15

नोड में " Bufferउदाहरण भी Uint8Arrayउदाहरण हैं ", इसलिए buf.toString()इस मामले में काम करता है।


मेरे लिए बहुत अच्छा काम करता है। और इतना सरल! लेकिन वास्तव में Uint8Array में String () विधि है।
कयामत

सरल और सुरुचिपूर्ण, पता नहीं था BufferUint8Array भी है। धन्यवाद!
LeOn - हान ली

1
@doom ब्राउज़र की तरफ, Uint8Array.toString () एक utf-8 स्ट्रिंग को संकलित नहीं करेगा, यह सरणी में संख्यात्मक मानों को सूचीबद्ध करेगा। तो अगर आपके पास एक अन्य स्रोत से एक Uint8Array है जो एक बफ़र भी नहीं होता है, तो आपको जादू करने के लिए एक बनाने की आवश्यकता होगी:Buffer.from(uint8array).toString('utf-8')
जोकिम लूस

12

अल्बर्ट द्वारा दिया गया समाधान तब तक अच्छी तरह से काम करता है जब तक कि प्रदान किया गया फ़ंक्शन अनन्त रूप से लागू नहीं होता है और केवल मामूली आकार के सरणियों के लिए उपयोग किया जाता है, अन्यथा यह अत्यधिक अक्षम है। यहाँ एक बढ़ाया वेनिला जावास्क्रिप्ट समाधान है जो नोड और ब्राउज़र दोनों के लिए काम करता है और इसके निम्नलिखित फायदे हैं:

• सभी ओकटेट सरणी आकारों के लिए कुशलतापूर्वक काम करता है

• कोई मध्यवर्ती फेंक-दूर तार उत्पन्न करता है

• आधुनिक JS इंजन पर 4-बाइट वर्णों का समर्थन करता है (अन्यथा "?" प्रतिस्थापित है)

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
यहां सबसे अच्छा समाधान, क्योंकि यह 4-बाइट-कैरेक्टर (जैसे इमोजीस) को भी धन्यवाद देता है!
फिफ्फ

1
और इसका विलोम क्या है?
simbo1905

6

क्या करें @ सुधीर ने कहा, और फिर संख्या के उपयोग की अल्पविराम से अलग सूची से एक स्ट्रिंग प्राप्त करने के लिए:

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

यह आपको वह स्ट्रिंग देगा जो आप चाहते हैं, अगर यह अभी भी प्रासंगिक है


क्षमा करें, आपने उस अंतिम सेंटेंस पर ध्यान नहीं दिया है जिसमें आपने कहा था कि आप एक बार में एक वर्ण जोड़ना नहीं चाहते हैं। आशा है कि यह उन लोगों की मदद करता है जिनके पास CPU उपयोग की समस्या नहीं है।
शुकी

14
यह UTF8 डिकोडिंग नहीं करता है।
अल्बर्ट

और भी छोटा String.fromCharCode.apply(null, unitArr);:। जैसा कि उल्लेख किया गया है, यह UTF8 एन्कोडिंग को संभालता नहीं है, लेकिन कभी-कभी यह काफी सरल होता है, यदि आपको केवल ASCII समर्थन की आवश्यकता होती है, लेकिन TextEncoder / TextDecoder तक पहुंच नहीं है।
रवेनस्टाइन

उत्तर में एक @Sudhir का उल्लेख है लेकिन मैंने पृष्ठ खोजा और अब ऐसा उत्तर मिला। इसलिए जो कुछ भी उन्होंने कहा वह बेहतर होगा
जोकिम

यह लंबे समय तक तार पर भयानक प्रदर्शन होगा। तार पर + ऑपरेटर का उपयोग न करें।
अधिकतम

3

आप उपयोग नहीं कर सकते TextDecoder एपीआई क्योंकि यह IE पर समर्थित नहीं है :

  1. आप मोज़िला डेवलपर नेटवर्क वेबसाइट द्वारा अनुशंसित FastestSmallestTextEncoderDecoder पॉलीफ़िल का उपयोग कर सकते हैं ;
  2. आप 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

इन कार्यों की कोशिश करो,

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)
}

स्रोत: https://gist.github.com/tomfa/706d10fed78c497731ac , कुदोस से तोमफ़ा


2

मुझे यह देखकर निराशा हुई कि लोग यह नहीं दिखा रहे थे कि दोनों तरह से कैसे जाना है या यह दिखाना है कि चीजें किसी भी तरह के यूटीएफ 8 तार पर काम नहीं करती हैं। मुझे codereview.stackexchange.com पर एक पोस्ट मिली जिसमें कुछ कोड हैं जो अच्छी तरह से काम करते हैं। मैंने इसका उपयोग प्राचीन रनों को बाइट्स में बदलने के लिए किया, बाइट्स पर कुछ क्रापो का परीक्षण करने के लिए, फिर चीजों को वापस एक स्ट्रिंग में परिवर्तित किया। वर्किंग कोड यहाँ github पर है । मैंने स्पष्टता के लिए तरीकों का नाम बदला:

// 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;
}

यूनिट टेस्ट इस UTF-8 स्ट्रिंग का उपयोग करता है:

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

ध्यान दें कि स्ट्रिंग की लंबाई केवल 117 अक्षर है लेकिन बाइट की लंबाई, जब एन्कोडेड है, 234 है।

अगर मैं कंसोल को अनलॉग कर देता हूं। लाइन्स मैं देख सकता हूं कि जो स्ट्रिंग डिकोड की गई है, वही स्ट्रिंग है जिसे एन्कोड किया गया था (बाइट्स के साथ शमीर के गुप्त शेयरिंग एल्गोरिथ्म के माध्यम से पारित!):

इकाई परीक्षण कि डेमो एन्कोडिंग और डिकोडिंग


String.fromCharCode.apply(null, chars)charsबहुत बड़ा होने पर त्रुटि होगी ।
मार्क जे। श्मिट

1

NodeJS में, हमारे पास बफ़र्स उपलब्ध हैं, और उनके साथ स्ट्रिंग रूपांतरण वास्तव में आसान है। बेहतर है, Uint8Array को बफ़र में बदलना आसान है। इस कोड को आज़माएं, यह मेरे लिए नोड में काम किया गया है, जो मूल रूप से Uint8Arrays से किसी भी रूपांतरण के लिए है:

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

हम सिर्फ Uint8Array से ArrayBuffer निकाल रहे हैं और फिर एक उचित NodeJS बफर में परिवर्तित कर रहे हैं। फिर हम बफर को एक स्ट्रिंग में परिवर्तित करते हैं (यदि आप चाहें तो आप हेक्स या बेस 64 एन्कोडिंग में फेंक सकते हैं)।

यदि हम एक स्ट्रिंग से वापस Uint8Array में बदलना चाहते हैं, तो हम ऐसा करेंगे:

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

ध्यान रखें कि यदि आपने स्ट्रिंग में कनवर्ट करते समय बेस 64 जैसे एन्कोडिंग की घोषणा की है, तो Buffer.from(str, "base64")यदि आपने बेस 64, या जो भी अन्य एन्कोडिंग का उपयोग किया है, उसका उपयोग करना होगा ।

यह एक मॉड्यूल के बिना ब्राउज़र में काम नहीं करेगा! NodeJS बफर केवल ब्राउज़र में मौजूद नहीं है, इसलिए यह विधि तब तक काम नहीं करेगी जब तक आप ब्राउज़र में बफर कार्यक्षमता नहीं जोड़ते। हालांकि यह वास्तव में बहुत आसान है, बस इस तरह से एक मॉड्यूल का उपयोग करें , जो छोटा और तेज दोनों है!


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;
}

`


उत्तर देने के लिए कुछ विवरण जोड़ें। @terran
रोहित

-3

मैं इस टाइपस्क्रिप्ट स्निपेट का उपयोग कर रहा हूं:

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;
}

यदि आपको जावास्क्रिप्ट संस्करण की आवश्यकता है तो टाइप एनोटेशन निकालें। उम्मीद है की यह मदद करेगा!


3
ओपी ने एक बार में एक चार नहीं जोड़ने के लिए कहा। इसके अलावा, वह इसे सूची के स्ट्रिंग-प्रतिनिधित्व के रूप में प्रदर्शित नहीं करना चाहता है, बल्कि एक स्ट्रिंग के रूप में प्रदर्शित करना चाहता है। इसके अलावा, यह वर्णों को स्ट्रिंग में परिवर्तित नहीं करता है, लेकिन इसकी संख्या प्रदर्शित करता है।
अल्बर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.