জাভাস্ক্রিপ্টে স্ট্রিং করতে Uint8Array


122

আমার জাভা স্ক্রিপ্টে ইউএনটি 8 অ্যারে উপাদানগুলির একটি সীমার মধ্যে কিছু ইউটিএফ -8 এনকোডড ডেটা রয়েছে। এগুলিকে নিয়মিত জাভাস্ক্রিপ্ট স্ট্রিংয়ে ডিকোড করার কোনও কার্যকর উপায় আছে (আমি বিশ্বাস করি জাভাস্ক্রিপ্ট 16 বিট ইউনিকোড ব্যবহার করে)? আমি সেই সময়ে একটি চরিত্র যুক্ত করতে চাই না কারণ স্ট্রিং কনকন্টেরেশনটি সিপিইউ নিবিড় হয়ে উঠবে।


এটি কাজ করবে কিনা তা নিশ্চিত নয়, তবে u8array.toString()ব্রাউজারএসএফ থেকে ফাইলগুলি পড়ার সময় আমি ব্যবহার করি যা আপনি কল করার সময় Uint8Array অবজেক্টটি প্রকাশ করে fs.readFile
jcubic

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

39
কেউ আমার মত অলস জন্য npm install text-encoding, var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;। না ধন্যবাদ.
ইভান হু

16
এনপিএম পাঠ্য-এনকোডিং গ্রন্থাগার থেকে সাবধান থাকুন, ওয়েবপ্যাক বান্ডিল বিশ্লেষক লাইব্রেরিটি বিশাল দেখায়
ওয়েফথফিউচার

3
@ ভিনসেন্টচাইব ব্রাউজারগুলি ব্যতীত অন্য কোনও ফর্ম্যাটের সমর্থন সরিয়ে দিয়েছে utf-8। সুতরাং, TextEncoderযুক্তি অপ্রয়োজনীয়!
ট্রিপলস

1
nodejs.org/api/string_decoder.html উদাহরণ থেকে: কনস্ট {স্ট্রিংডেকোডার require = প্রয়োজন ('স্ট্রিং_ডেকোডার'); কনস্ট ডিকোডার = নতুন স্ট্রিংডেকোডার ('utf8'); কনস্টেন্ট সেন্ট = বাফার.ফ্রোম ([0xC2, 0xA2]); console.log (decoder.write (শতাংশ));
24:48

4
মনে রাখবেন যে নোড.জেএসগুলি 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
এই ধীরে ধীরে মনে হচ্ছে। তবে মহাবিশ্বের একমাত্র স্নিপেট আমি দেখতে পেয়েছি works ভাল + গ্রহণ অবলম্বন!
রেডসান্দ্রো

6
আমি কেন বুঝতে পারি না এর কেন আরও বেশি উদ্যোগ নেই। এটি ছোট স্নিপকেটের জন্য ইউটিএফ -8 কনভেনশনের মাধ্যমে ক্র্যাঙ্ক করা বিশিষ্ট বোধগম্য মনে হয়। অন্যেরা যেমন ইঙ্গিত করেছে যেমন অ্যাসিঙ্ক ব্লব + ফাইলরেডার বড় লেখাগুলির জন্য দুর্দান্ত কাজ করে।
ড্যানহর্নার 21

2
প্রশ্নটি ছিল স্ট্রিং কনটেন্টেশন ছাড়াই এটি কীভাবে করা যায়
জ্যাক ওয়েস্টার

5
4+ বাইট সিকোয়েন্সগুলি হ্যান্ডেল না করে দুর্দান্ত কাজ করে, উদাহরণস্বরূপ fromUTF8Array([240,159,154,133])খালি পরিণত হয় (যখন fromUTF8Array([226,152,131])→"☃")
অবিস্মরণীয়

1
8, 9, 10 এবং 11 কে কেন বাদ দেওয়া হয়েছে? কোন বিশেষ কারণ? এবং কেস 15 এছাড়াও সম্ভব, তাই না? 15 (1111) 4 বাইট ব্যবহার করা হয় তা বোঝায়, তাই না?
আরআর

31

আমি যা ব্যবহার করি তা এখানে:

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

7
ডকটি থেকে , এটি ইউটিএফ 8 ডিকোড করে বলে মনে হচ্ছে না।
অ্যালবার্ট

29
এটি RangeErrorবড় টেক্সট নিক্ষেপ করবে । "সর্বাধিক কল স্ট্যাকের আকার ছাড়িয়ে গেছে"
রেডসান্দ্রো

1
আপনি বাইনারি স্ট্রিং বড় Uint8Arrays রূপান্তর এবং RangeError পেয়ে হয়, থেকে Uint8ToString ফাংশন দেখতে stackoverflow.com/a/12713326/471341
yonran

SCRIPT28: Out of stack spaceআমি যখন এটি 300+ কে অক্ষর, বা RangeErrorক্রোম 39-এর জন্য খাওয়াচ্ছি তখন IE 11 টি ছোঁড়ে Firef ফায়ারফক্স 33 ঠিক আছে। 100 + কে তিনটি দিয়েই ঠিক আছে।
শেপি

এটি এন.ইউইকিপিডিয়া . org / উইকি / ইউএফএফ -৮- তে ইউনিকোডের উদাহরণগুলির থেকে সঠিক ফলাফল দেয় না । উদাহরণস্বরূপ স্ট্রিং.ফ্রোমচর কোড.অ্যাপ্লি (নাল, নতুন ইউিন্ট 8আর্রে ([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 বাইট বলুন) এর উইকিচার কথোপকথনের সিঙ্ক্রোনাস ইউটিএফ -8 এর মধ্যে প্রয়োগ করা হয়েছে, বলুন, ভি 8 মাইক্রোসেকেন্ডের চেয়ে অনেক কম হওয়া উচিত যদিও আমি অনুমান করব যে আপনার কোডটি কয়েকগুণ বেশি প্রয়োজন require সব একই ধন্যবাদ।
জ্যাক ওয়েস্টার

15

নোডে " Bufferউদাহরণগুলিও Uint8Arrayউদাহরণস্বরূপ ", সুতরাং buf.toString()এই ক্ষেত্রে কাজ করে।


আমার জন্য দুর্দান্ত কাজ করে এবং এত সহজ! তবে বাস্তবে ইউন্ট 8আর্রে টুস্ট্রিং () পদ্ধতি রয়েছে।
নিয়তি

সহজ এবং মার্জিত, সচেতন ছিল না BufferUint8Araray। ধন্যবাদ!
লিওন - হ্যান লি

1
@ অ্যাডম ব্রাউজারের দিকে, Uint8Array.toString () একটি utf-8 স্ট্রিং সংকলন করবে না, এটি অ্যারেতে সংখ্যার মানগুলি তালিকাভুক্ত করবে। সুতরাং যদি আপনার কাছে অন্যটি উত্স থেকে একটি Uint8 অ্যারে হয় যা বাফার হিসাবে ঘটে না তবে আপনার যাদু করার জন্য এটি তৈরি করতে হবে:Buffer.from(uint8array).toString('utf-8')
জোচিম লাউস

12

অ্যালবার্ট প্রদত্ত সমাধানটি ততক্ষণ কাজ করে যতক্ষণ সরবরাহ করা ফাংশনটি খুব কম সময়ে আহ্বান করা হয় এবং কেবলমাত্র পরিমিত আকারের অ্যারেগুলির জন্য ব্যবহৃত হয়, অন্যথায় এটি গুরুতরভাবে অক্ষম। এখানে একটি বর্ধিত ভ্যানিলা জাভাস্ক্রিপ্ট সমাধান যা নোড এবং ব্রাউজার উভয়ের জন্যই কাজ করে এবং এর নিম্নলিখিত সুবিধা রয়েছে:

All সমস্ত অক্টেট অ্যারের আকারের জন্য দক্ষতার সাথে কাজ করে

Inter কোনও মধ্যবর্তী নিক্ষেপ স্ট্রিং উত্পন্ন করে না

Modern আধুনিক জেএস ইঞ্জিনগুলিতে 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])
        }

এটি এখনও প্রাসঙ্গিক হলে এটি আপনার পছন্দ মতো স্ট্রিং দেবে


দুঃখিত, আপনি যে একবারে একটি অক্ষর যুক্ত করতে চান না বলে সর্বশেষ প্রকাশ্য প্রতিবেদনটি লক্ষ্য করেন নি। আশা করি এটি অন্যদের সহায়তা করে যাদের সিপিইউ ব্যবহারের ক্ষেত্রে সমস্যা নেই।
শুকী

14
এটি ইউটিএফ 8 ডিকোডিং করে না।
অ্যালবার্ট

এমনকি খাটো: String.fromCharCode.apply(null, unitArr);। উল্লিখিত হিসাবে, এটি ইউটিএফ 8 এনকোডিংটি পরিচালনা করে না, তবে কখনও কখনও এটি কেবল সহজ তবে আপনার যদি কেবল এএসসিআইআই সমর্থন প্রয়োজন তবে টেক্সটইনকোডার / পাঠ্যসূচীটিতে অ্যাক্সেস না থাকে।
রাভেনস্টাইন

উত্তরে একটি @ সুধীরের উল্লেখ আছে তবে আমি পৃষ্ঠাটি অনুসন্ধান করেছি এবং এখনই এরকম উত্তর পেয়েছি। তাই তিনি যা কিছু বললেন তা ইনলাইন করা ভাল
জোয়াকিম

দীর্ঘতর স্ট্রিংগুলিতে এটি ভয়াবহ অভিনয় করবে। স্ট্রিংগুলিতে + অপারেটর ব্যবহার করবেন না।
সর্বাধিক

3

আপনি যদি TextDecoder API ব্যবহার করতে না পারেন কারণ এটি IE তে সমর্থিত নয় :

  1. আপনি দ্বারা প্রস্তাবিত দ্রুততমতমতমতম পাঠ্য এনকোডার ডিকোডার পলিফিলটি ব্যবহার করতে পারেন মজিলা বিকাশকারী নেটওয়ার্ক ওয়েবসাইটের ;
  2. আপনি এমডিএন ওয়েবসাইটে প্রদত্ত এই ফাংশনটি ব্যবহার করতে পারেন :

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

আমি হতাশ হয়ে গিয়েছিলাম যে লোকেরা উভয় পথে কীভাবে যাবেন বা দেখায় না যে জিনিসগুলি কোনও তুচ্ছ UTF8 স্ট্রিংয়ে কাজ করে না। আমি কোডরেভিউ.স্ট্যাকেক্সেঞ্জোয়েন্ট.কম এ একটি পোস্ট পেয়েছি যাতে কিছু কোড রয়েছে যা ভালভাবে কাজ করে। আমি এটিকে প্রাচীন রুনগুলিকে বাইটে পরিণত করতে, বাইটগুলিতে কিছু ক্রিপো পরীক্ষা করতে, তারপরে জিনিসগুলিকে আবার স্ট্রিংয়ে রূপান্তর করতে ব্যবহার করি। ওয়ার্কিং কোডটি এখানে গিথুবে রয়েছে । আমি স্পষ্টতার জন্য পদ্ধতিগুলির নামকরণ করেছি:

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

ইউনিট পরীক্ষাটি এই ইউটিএফ -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

নোডজেএসে, আমাদের কাছে বাফার উপলব্ধ রয়েছে এবং তাদের সাথে স্ট্রিং রূপান্তরটি সত্যই সহজ। আরও ভাল, একটি ইউন্ট 8আরিকে বাফারে রূপান্তর করা সহজ। এই কোডটি ব্যবহার করে দেখুন, নোডে মূলত ইউিন্ট 8আর্রে জড়িত কোনও রূপান্তরের জন্য এটি আমার জন্য কাজ করেছে:

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

আমরা কেবল Uint8Array থেকে অ্যারেবফারটি বের করছি এবং তারপরে এটিকে একটি উপযুক্ত নোডজেএস বাফারে রূপান্তর করছি। তারপরে আমরা বাফারকে একটি স্ট্রিংয়ে রূপান্তর করি (আপনি চাইলে আপনি একটি হেক্স বা বেস 64 এনকোডিং ফেলতে পারেন)।

যদি আমরা কোনও স্ট্রিং থেকে আবার ইউিন্ট 8 অ্যারে রূপান্তর করতে চাই, তবে আমরা এটি করব:

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

সচেতন হন যে আপনি যদি স্ট্রিংয়ে রূপান্তর করার সময় বেস 64 এর মতো একটি এনকোডিং ঘোষণা করেছেন তবে আপনি Buffer.from(str, "base64")বেস 64 ব্যবহার করেছেন বা অন্য যে কোনও এনকোডিং আপনি ব্যবহার করেছেন তা ব্যবহার করতে হবে।

এটি মডিউল ছাড়া ব্রাউজারে কাজ করবে না! নোডজেএস বাফারগুলি কেবল ব্রাউজারে বিদ্যমান নেই, সুতরাং আপনি ব্রাউজারে বাফার কার্যকারিতা যুক্ত না করলে এই পদ্ধতিটি কাজ করবে না। এটা আসলে বেশ সহজ যদিও করতে হয়, ঠিক একটি মডিউল ব্যবহার এই , যা উভয় ক্ষুদ্র ও দ্রুত!


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

`


উত্তরে কিছু বর্ণনা যুক্ত করুন। @ ইটারান
রোহিত

-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
ওপি একবারে একটি করে চর যোগ না করতে বলেছে। এছাড়াও, তিনি এটিকে তালিকার স্ট্রিং-প্রতিনিধিত্ব হিসাবে প্রদর্শন করতে চান না বরং কেবল একটি স্ট্রিং হিসাবে প্রদর্শন করতে চান। এছাড়াও, এটি অক্ষরগুলিকে স্ট্রিংয়ে রূপান্তরিত করে না তবে এটির সংখ্যাটি প্রদর্শন করে।
অ্যালবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.