জাভাস্ক্রিপ্ট স্ট্রিংয়ে কয়টি বাইট?


97

আমার কাছে একটি জাভাস্ক্রিপ্ট স্ট্রিং রয়েছে যা ইউটিএফ -8-এ সার্ভার থেকে পাঠানোর সময় প্রায় 500K। আমি জাভাস্ক্রিপ্টে এর আকারটি কীভাবে বলতে পারি?

আমি জানি যে জাভাস্ক্রিপ্টটি ইউসিএস -২ ব্যবহার করে, সুতরাং এর অর্থ কী প্রতি চরিত্রের জন্য 2 বাইট? তবে এটি কি জাভাস্ক্রিপ্ট বাস্তবায়নের উপর নির্ভর করে? অথবা পৃষ্ঠায় এনকোডিং বা কন্টেন্ট-টাইপ হতে পারে?


প্রায়. উত্তর দৈর্ঘ্য * চরসাইজ হবে, সুতরাং আপনার অনুমান কাছাকাছি।
ভাসমান

4
: আধুনিক জাভাস্ক্রিপ্ট, উদাহরণস্বরূপ ES6, শুধুমাত্র UCS-2, আরো বিস্তারিত এখানে ব্যবহার করে না stackoverflow.com/a/46735247/700206
whitneyland

উত্তর:


36

Stringমানগুলি বাস্তবায়ন নির্ভর নয়, ইসিএমএ-262 তৃতীয় সংস্করণ উল্লেখ অনুযায়ী প্রতিটি অক্ষর UTF-16 পাঠ্যের একক 16-বিট ইউনিট উপস্থাপন করে :

4.3.16 স্ট্রিংয়ের মান

একটি স্ট্রিং মান স্ট্রিং টাইপের সদস্য এবং এটি শূন্য বা আরও 16-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার মানগুলির সীমাবদ্ধ ক্রম।

দ্রষ্টব্য যদিও প্রতিটি মান সাধারণত UTF-16 পাঠ্যের একক 16-বিট ইউনিট উপস্থাপন করে, ভাষাটি 16-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার ব্যতীত মানগুলিতে কোনও সীমাবদ্ধতা বা প্রয়োজনীয়তা রাখে না।


8
আমার এই উত্তরণটি পড়া বাস্তবায়নের স্বাধীনতার ইঙ্গিত দেয় না।
পল বিগার

4
ইউটিএফ -16 গ্যারান্টিযুক্ত নয়, কেবল স্ট্রিংগুলির সত্যতা 16-বিট ইনট হিসাবে সঞ্চিত।
বিজোরল

এটি কেবলমাত্র ইউটিএফ -16 এর সাথে সম্পর্কিত বাস্তবায়ন-নির্ভর। 16 বিট চরিত্রের বিবরণ সর্বজনীন।
পাঞ্জারিসিস

4
আমি মনে করি অভ্যন্তরীণভাবে ফায়ারফক্স কিছু স্ট্রিংয়ের জন্য অক্ষর প্রতি 1 বাইট ব্যবহার করতে পারে .... ব্লগ.মোজিলা.আর
মিশাল চেরেমজা

4
আমি এটি যেভাবে পড়ছি তা ইউটিএফ -16 স্পষ্টভাবে অনুমোদিত নয়। ইউটিএফ -১ characters অক্ষরের মধ্যে 4 বাইট থাকতে পারে, তবে অনুমানটি বলেছে "মানগুলি 16-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার হতে হবে"। এর অর্থ জাভাস্ক্রিপ্ট স্ট্রিং মানগুলি ইউটিএফ -16 এর একটি উপসেট, তবে, 3 বা 4 বাইট অক্ষর ব্যবহার করে যে কোনও ইউটিএফ -16 স্ট্রিং অনুমতি দেওয়া হবে না।
হোয়াইটনিল্যান্ড

71

এই ফাংশনটি আপনার কাছে যে কোনও ইউটিএফ -8 স্ট্রিংয়ের বাইট আকার দেয়।

function byteCount(s) {
    return encodeURI(s).split(/%..|./).length - 1;
}

সূত্র

জাভাস্ক্রিপ্ট ইঞ্জিনগুলি ইউসিএস -2 বা ইউটিএফ -16 অভ্যন্তরীণভাবে ব্যবহার করতে পারে। আমি ইউটিএফ -16 ব্যবহার সম্পর্কে জানি এমন বেশিরভাগ ইঞ্জিন, তবে তারা যে কোনও পছন্দই করুক না কেন, এটি কেবলমাত্র একটি বাস্তবায়নের বিশদ যা ভাষার বৈশিষ্ট্যগুলিকে প্রভাবিত করবে না।

ইসিএমএসক্রিপ্ট / জাভাস্ক্রিপ্ট ভাষা নিজেই, ইউটিএফ -16 অনুযায়ী নয়, ইউসিএস -২ অনুযায়ী অক্ষর উন্মুক্ত করে।

সূত্র


9
.split(/%(?:u[0-9A-F]{2})?[0-9A-F]{2}|./)পরিবর্তে ব্যবহার করুন। আপনার স্নিপেট স্ট্রিংগুলির জন্য ব্যর্থ হয় যা "% ইউএক্সএক্সএক্সএক্সএক্স" এ এনকোড করে।
রব ডব্লু

ওয়েবসকেট ফ্রেমে আকারের গণনার জন্য ব্যবহৃত, স্ট্রিং ফ্রেমের জন্য ক্রোম ডেভ সরঞ্জাম হিসাবে একই আকার দেয়।
ব্যবহারকারী 85155

4
এস 3 এ আপলোড করা জাভাস্ক্রিপ্ট স্ট্রিংয়ের জন্য ব্যবহৃত হয়েছে, এস 3 ঠিক একই আকারের প্রদর্শন করে [[বাইটকাউন্ট (গুলি) / 1024)। টো ফিক্সড (2) + "কিবি"]
ব্যবহারকারীর 85155

49

আপনি যদি নোড.জেএস ব্যবহার করছেন তবে বাফার ব্যবহারের একটি সহজ সমাধান রয়েছে :

function getBinarySize(string) {
    return Buffer.byteLength(string, 'utf8');
}

এর জন্য একটি এনপিএম লিবি রয়েছে: https://www.npmjs.org/package/utf8-binary-cutter (বিশ্বস্ততার দ্বারা আপনার)


42

বাইটগুলিতে স্ট্রিংয়ের আকার পেতে আপনি ব্লব ব্যবহার করতে পারেন ।

উদাহরণ:

console.info(
  new Blob(['😂']).size,                             // 4
  new Blob(['👍']).size,                             // 4
  new Blob(['😂👍']).size,                           // 8
  new Blob(['👍😂']).size,                           // 8
  new Blob(['I\'m a string']).size,                  // 12

  // from Premasagar correction of Lauri's answer for
  // strings containing lone characters in the surrogate pair range:
  // https://stackoverflow.com/a/39488643/6225838
  new Blob([String.fromCharCode(55555)]).size,       // 3
  new Blob([String.fromCharCode(55555, 57000)]).size // 4 (not 6)
);


4
ব্লবসের জন্য Thankশ্বরের ধন্যবাদ! এটি সম্ভবত আধুনিক ব্রাউজারগুলির জন্য গ্রহণযোগ্য উত্তর হওয়া উচিত।
প্রসংশাথ

কিভাবে নোড.জেজে ব্লব আমদানি করবেন?
আলেকজান্ডার মিলস

4
আহ, নোড.জেএস সহ আমরা বাফার ব্যবহার করি, উদাহরণস্বরূপBuffer.from('😂').length
আলেকজান্ডার মিলস

19

আনস্কেপ জেএস ফাংশনটি ব্যবহার করে এই সমন্বয়টি ব্যবহার করে দেখুন:

const byteAmount = unescape(encodeURIComponent(yourString)).length

সম্পূর্ণ এনকোড প্রসেস উদাহরণ:

const s  = "1 a ф № @ ®"; //length is 11
const s2 = encodeURIComponent(s); //length is 41
const s3 = unescape(s2); //length is 15 [1-1,a-1,ф-2,№-3,@-1,®-2]
const s4 = escape(s3); //length is 39
const s5 = decodeURIComponent(s4); //length is 11

4
unescapeজাভাস্ক্রিপ্ট ফাংশন অনুমোদিত নয় এবং ইউনিফর্ম রিসোর্স শনাক্তকারীগণ (কোনো URI) ডিকোড করতে না ব্যবহার করা উচিত। উত্স
লাউরি ওহের্ড

@ লৌরিহের্ড আমি জানি মন্তব্যটি পুরানো, কিন্তু: এই উত্তরে ইউআরআইগুলি ডিকোডunescape করতে ব্যবহৃত হয় না । এটি সিকোয়েন্সগুলি একক অক্ষরে রূপান্তর করতে ব্যবহৃত হয় । হিসাবে এনকোড হল UTF-8 যেমন একটি স্ট্রিং, তার সংশ্লিষ্ট হওয়া ASCII অক্ষর হিসাবে বা যেমন পারেন codeunits প্রতিনিধিত্বমূলক ক্রম, কলিং একটি ফলাফল বাইনারি স্ট্রিং মূল স্ট্রিং এর হল UTF-8 উপস্থাপনা রয়েছে। সঠিকভাবে কল করা ইউটিএফ -8 হিসাবে এনকোড করা স্ট্রিংয়ের বাইটগুলিতে আকার দেয়। %xxencodeURIComponent%xxunescape(encodeURIComponent(...)).length
টিএস

এবং হ্যাঁ ( un) escape১৯৯৯ সাল থেকে অবচয় করা হয়েছে তবে এটি প্রতিটি ব্রাউজারে এখনও উপলভ্য ... - এটি বলেছিল যে, এটি হ্রাস করার উপযুক্ত কারণ আছে। এগুলিকে সঠিকভাবে ব্যবহার করার উপায় নেই ( en- / decodeURI( Component) এর সাথে ইউএনএফ -8 ডিকোডিং ব্যতীত - অথবা কমপক্ষে আমি ( un) এর জন্য অন্য কোনও কার্যকর অ্যাপ্লিকেশন জানি না escape। এবং আজ ইউটিএফ 8 ( TextEncoderইত্যাদি) এনকোড / ডিকোড করার আরও ভাল বিকল্প রয়েছে
টিএস

10

মনে রাখবেন যে আপনি যদি নোড.জেগুলি লক্ষ্য করে থাকেন তবে আপনি এটি ব্যবহার করতে পারেন Buffer.from(string).length:

var str = "\u2620"; // => "☠"
str.length; // => 1 (character)
Buffer.from(str).length // => 3 (bytes)

7

ইউটিএফ -8 কোড পয়েন্ট প্রতি 1 থেকে 4 বাইট ব্যবহার করে অক্ষরগুলিকে এনকোড করে। সিএমএস হিসাবে গৃহীত উত্তরে উল্লেখ করা হয়েছে, জাভাস্ক্রিপ্ট প্রতিটি অক্ষর অভ্যন্তরীণভাবে 16 বিট (2 বাইট) ব্যবহার করবে।

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

      getStringMemorySize = function( _string ) {
        "use strict";

        var codePoint
            , accum = 0
        ;

        for( var stringIndex = 0, endOfString = _string.length; stringIndex < endOfString; stringIndex++ ) {
            codePoint = _string.charCodeAt( stringIndex );

            if( codePoint < 0x100 ) {
                accum += 1;
                continue;
            }

            if( codePoint < 0x10000 ) {
                accum += 2;
                continue;
            }

            if( codePoint < 0x1000000 ) {
                accum += 3;
            } else {
                accum += 4;
            }
        }

        return accum * 2;
    }

উদাহরণ:

getStringMemorySize( 'I'    );     //  2
getStringMemorySize( '❤'    );     //  4
getStringMemorySize( '𠀰'   );     //  8
getStringMemorySize( 'I❤𠀰' );     // 14

7

এই আমি ব্যবহার 3 টি উপায়:

  1. পাঠ্য এনকোডার ()

    (new TextEncoder().encode("myString")).length)

  2. ব্লব

    new Blob(["myString"]).size)

  3. বাফার

    Buffer.byteLength("myString", 'utf8'))


5

একটি জাভাস্ক্রিপ্ট স্ট্রিং এর আকার হয়

  • প্রাক ES6 : 2 অক্ষর প্রতি বাইট
  • ES6 এবং তার পরে: চরিত্র অনুসারে 2 বাইট, বা চরিত্র অনুসারে 5 বা আরও বেশি বাইট

প্রাক ES6
সর্বদা অক্ষর প্রতি 2 বাইট। ইউটিএফ -16 অনুমোদিত নয় কারণ অনুপস্থিতিতে বলা হয়েছে "মানগুলি 16-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার হতে হবে"। যেহেতু ইউটিএফ -16 স্ট্রিং 3 বা 4 বাইট অক্ষর ব্যবহার করতে পারে তাই এটি 2 বাইটের প্রয়োজনীয়তা লঙ্ঘন করবে। গুরুতরভাবে, যদিও ইউটিএফ -16 সম্পূর্ণরূপে সমর্থন করা যায় না, মানকটির প্রয়োজন হয় যে দুটি বাইট অক্ষর ব্যবহৃত বৈধ ইউটিএফ -16 অক্ষর। অন্য কথায়, প্রাক ES6 জাভাস্ক্রিপ্ট স্ট্রিংগুলি ইউটিএফ -16 অক্ষরের একটি উপসেট সমর্থন করে।

ES6 এবং পরবর্তী
অক্ষরে 2 বাইট, বা চরিত্র অনুসারে 5 বা আরও বেশি বাইট। অতিরিক্ত মাপ খেলতে আসে কারণ ES6 (ECMAScript 6) ইউনিকোড কোড পয়েন্ট পলায়নের জন্য সমর্থন যোগ করে । একটি ইউনিকোড এস্কেপ ব্যবহার করা দেখতে এরকম দেখাচ্ছে: \ u {1D306}

ব্যবহারিক নোট

  • এটি কোনও নির্দিষ্ট ইঞ্জিনের অভ্যন্তরীণ প্রয়োগের সাথে সম্পর্কিত নয়। উদাহরণস্বরূপ, কিছু ইঞ্জিন সম্পূর্ণ ইউটিএফ -16 সমর্থন সহ ডেটা স্ট্রাকচার এবং লাইব্রেরি ব্যবহার করে, তবে তারা বাহ্যিকভাবে যা সরবরাহ করে তা পুরো ইউটিএফ -16 সমর্থন করে না। এছাড়াও একটি ইঞ্জিন বহিরাগত ইউটিএফ -16 সমর্থন সরবরাহ করতে পারে তবে এটি করার বাধ্যতামূলক নয়।

  • ES6 এর জন্য, ব্যবহারিকভাবে বলার অক্ষরগুলি কখনই 5 বাইটের বেশি দীর্ঘ হতে পারে না (ইউনিকোড কোড পয়েন্টের জন্য এস্কেপ পয়েন্টের জন্য 2 বাইট + 3 বাইট) কারণ ইউনিকোডের সর্বশেষতম সংস্করণে কেবলমাত্র 136,755 টি অক্ষর রয়েছে যা সহজেই 3 বাইটে ফিট করে। তবে এটি প্রযুক্তিগতভাবে স্ট্যান্ডার্ডের দ্বারা সীমাবদ্ধ নয় তাই মূলত একটি অক্ষর কোড পয়েন্টের জন্য 4 বাইট এবং মোট 6 বাইট ব্যবহার করতে পারে।

  • বাইট সাইজ গণনা করার জন্য এখানে বেশিরভাগ কোড উদাহরণগুলি ES6 ইউনিকোড কোড পয়েন্টটি পালিয়ে যায় বলে মনে হয় না, তাই ফলাফলগুলি কিছু ক্ষেত্রে ভুল হতে পারে।


4
শুধু ভাবছি, যদি আকারটি চরিত্র অনুসারে 2 বাইট হয় তবে কেন 4 Buffer.from('test').lengthএবং Buffer.byteLength('test')সমান 4 হয় (নোডে) এবং new Blob(['test']).size4 এর সমান হয়?
ব্যবহারকারীর 1063287

প্রাক-ইএস 6: ইউটিএফ -16 অনুমোদিত: ইসিএমএ -262 তৃতীয় সংস্করণ দেখুন (1999 থেকে) : প্রথম পৃষ্ঠায় ইউসিএস 2 বা ইউটিএফ -16 অনুমোদিত রয়েছে। পৃষ্ঠা 5, স্ট্রিং মানের সংজ্ঞা: "... যদিও প্রতিটি মান সাধারণত UTF-16 পাঠ্যের একক 16-বিট ইউনিট উপস্থাপন করে ..."। পৃষ্ঠায় ৮১ পৃষ্ঠায় একটি সারণী রয়েছে, এটি দেখায় যে কীভাবে মিলিত সারোগেট জোড়গুলি চারটি ইউটিএফ -8 বাইট হিসাবে এনকোড করতে হবে।
টিএস

"প্রতি চরিত্রের জন্য" - যদি এর অর্থ যদি আপনি করেন তবে প্রতি "ব্যবহারকারী-অনুভূত চরিত্র" ( স্পেস , সহজ ব্যাখ্যা ) এটি 16 বিট কোড ইউনিটের সংখ্যক হতে পারে। যদি আপনি "কোডপয়েন্ট" প্রতি অর্থ দিয়ে থাকেন তবে এটি হয় ইউটিএফ -16 এ এক বা দুটি 16 বিট কোড একক হতে পারে । (এটি 2.5 কোড ইউনিট হতে পারে না (বা আপনি কীভাবে 5 বাইট পাবেন?))
টিএস

জাভাস্ক্রিপ্ট স্ট্রিংয়ের প্রতিটি উপাদান ( ১--বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার মান ("উপাদানগুলি") ) অভ্যন্তরীণভাবে দুটি বাইট দ্বারা প্রতিনিধিত্ব করা হয়েছে কিনা তা স্ট্যান্ডার্ডে সংজ্ঞায়িত করা হয়নি। (এবং কিভাবে এটা হতে পারে -। যতদিন জাভাস্ক্রিপ্ট প্রোগ্রাম প্রদান করা ইন্টারফেস হিসাবে উদ্দীষ্ট মান সবকিছু যে কাজ করছে অনুসরণ) উদাহরণস্বরূপ মোজিলা ব্যবহার করতে পারেন কোডপয়েন্ট প্রতি মাত্র এক বাইট যদি স্ট্রিং শুধুমাত্র latin1 রয়েছে
হিজড়া

ইউনিকোড কোড পয়েন্ট পলায়নের স্ট্রিং দৈর্ঘ্যের সাথে কোনও সম্পর্ক নেই - উত্স কোডে স্ট্রিং উপস্থাপনের এটি কেবল একটি নতুন উপায়। ( '\u{1F600}'.length===2, '\u{1F600}'==='\uD83D\uDE00', '\u{1F600}'==='😀')
হিজড়া

3

একটি জাভাস্ক্রিপ্ট স্ট্রিংয়ের একটি একক উপাদানটিকে একটি একক UTF-16 কোড ইউনিট হিসাবে বিবেচনা করা হয়। এটি বলার জন্য, স্ট্রিংস অক্ষরগুলি 16-বিট (1 কোড ইউনিট) এ সংরক্ষণ করা হয় এবং 16-বিট 2 বাইট (8-বিট = 1 বাইট) এর সমান।

charCodeAt()পদ্ধতি প্রদত্ত সূচিতে হল UTF-16 কোড ইউনিট প্রতিনিধিত্বমূলক 0 এবং 65535 মাঝের একটি পূর্ণসংখ্যা ফিরে যাওয়ার ব্যবহার করা যাবে।

codePointAt()যেমন হল UTF-32 ইউনিকোড অক্ষর জন্য সমগ্র কোড বিন্দু মান ফেরত পাঠাতে ব্যবহার করা যাবে।

যখন কোনও ইউটিএফ -16 অক্ষরকে একটি একক 16-বিট কোড ইউনিটে উপস্থাপন করা যায় না, তখন এতে একটি সারোগেট জুড়ি থাকবে এবং সুতরাং দুটি কোড ইউনিট ব্যবহার করা হবে (2 x 16-বিট = 4 বাইট)

বিভিন্ন এনকোডিং এবং তাদের কোড ব্যাপ্তির জন্য ইউনিকোড এনকোডিংগুলি দেখুন ।


সুরোগেটদের সম্পর্কে আপনি যা বলেন তা ইসিএমএ স্ক্রিপ্টের অনুমান লঙ্ঘন করে। আমি উপরে মন্তব্য হিসাবে, চশমা প্রতি চরিত্র দুটি বাইট প্রয়োজন, এবং surrogate জোড়া অনুমতি লঙ্ঘন হবে।
হোয়াইটনিল্যান্ড

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

2

লৌরি ওহের্ডের উত্তরটি বন্যগুলিতে দেখা বেশিরভাগ স্ট্রিংয়ের জন্য ভাল কাজ করে, তবে যদি স্ট্রিংটিতে সারোগেট জুটির পরিসর, 0xD800 থেকে 0xDFFF এর মধ্যে একক অক্ষর থাকে তবে ব্যর্থ হয়। যেমন

byteCount(String.fromCharCode(55555))
// URIError: URI malformed

এই আর ফাংশনটি সমস্ত স্ট্রিং পরিচালনা করতে হবে:

function bytes (str) {
  var bytes=0, len=str.length, codePoint, next, i;

  for (i=0; i < len; i++) {
    codePoint = str.charCodeAt(i);

    // Lone surrogates cannot be passed to encodeURI
    if (codePoint >= 0xD800 && codePoint < 0xE000) {
      if (codePoint < 0xDC00 && i + 1 < len) {
        next = str.charCodeAt(i + 1);

        if (next >= 0xDC00 && next < 0xE000) {
          bytes += 4;
          i++;
          continue;
        }
      }
    }

    bytes += (codePoint < 0x80 ? 1 : (codePoint < 0x800 ? 2 : 3));
  }

  return bytes;
}

যেমন

bytes(String.fromCharCode(55555))
// 3

এটি সরোগেট জোড়যুক্ত স্ট্রিংগুলির জন্য আকারটি সঠিকভাবে গণনা করবে:

bytes(String.fromCharCode(55555, 57000))
// 4 (not 6)

ফলাফলগুলি নোডের অন্তর্নির্মিত কার্যের সাথে তুলনা করা যেতে পারে Buffer.byteLength:

Buffer.byteLength(String.fromCharCode(55555), 'utf8')
// 3

Buffer.byteLength(String.fromCharCode(55555, 57000), 'utf8')
// 4 (not 6)

1

আমি ভি 8 ইঞ্জিনের এম্বেড করা সংস্করণ নিয়ে কাজ করছি। আমি একটি স্ট্রিং পরীক্ষা করেছি। প্রতিটি ধাপে 1000 অক্ষর পুশ করা হচ্ছে। ইউটিএফ -8।

একক বাইট (8 বিট, এএনএসআই) অক্ষর "এ" (হেক্স: 41) দিয়ে প্রথম পরীক্ষা। দুটি বাইট অক্ষর (16 বিট) "Ω" (হেক্স: সিই এ 9) এবং তৃতীয় পরীক্ষা তিনটি বাইট অক্ষর (24 বিট) "☺" (হেক্স: ই 2 98 বিএ) সহ দ্বিতীয় পরীক্ষা।

তিনটি ক্ষেত্রেই ডিভাইস 888 000 অক্ষর এবং সিএ ব্যবহার করে মেমরি থেকে মুদ্রণ করে র‌্যামে 26 348 কেবি।

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

এম্বেড করা বা না, বাস্তবতা হল অক্ষরগুলি কেবল 16 বিটে সংরক্ষণ করা হয় না। দুর্ভাগ্যক্রমে আমার কোনও 100% উত্তর নেই, জাভাস্ক্রিপ্ট নিম্ন স্তরের অঞ্চলে কী করে। বিটিডব্লিউ আমি "এ" চরিত্রের অ্যারে দিয়ে একই (উপরে প্রথম পরীক্ষা) পরীক্ষা করেছি। প্রতি পদক্ষেপে 1000 টি আইটেম পুশ করা হয়েছে। (ঠিক একই পরীক্ষা। অ্যারেতে স্ট্রিং প্রতিস্থাপন করা হয়েছে) এবং সিস্টেমটি মেমরি থেকে বেরিয়ে আসে (চেয়েছিল) 10 416 কেবি ব্যবহার করে এবং 1 337 000 এর অ্যারে দৈর্ঘ্য ব্যবহার করে So সুতরাং, জাভাস্ক্রিপ্ট ইঞ্জিনটি সাধারণ সীমাবদ্ধ নয়। এটি একধরনের জটিল।


0

আপনি এটি চেষ্টা করতে পারেন:

  var b = str.match(/[^\x00-\xff]/g);
  return (str.length + (!b ? 0: b.length)); 

এটা আমার জন্য কাজ করেছে।


4
অবশ্যই এটি ধরে নিয়েছে যে সমস্ত চরিত্রটি সর্বোচ্চ 2 বাইট? যদি 3 বা 4 বাইট অক্ষর থাকে (যা ইউটিএফ -8 এ সম্ভব) তবে এই ফাংশনটি কেবল তাদের 2-বাইট অক্ষর হিসাবে গণনা করবে?
অ্যাডাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.