অ্যারে.ফর্মের সাথে কোন চরিত্রগুলি গোষ্ঠীযুক্ত?


38

আমি জেএসের সাথে ঘুরে বেড়াচ্ছি এবং এটি ব্যবহার করতে গিয়ে তৈরি করা অ্যারেতে কোন উপাদান যুক্ত করতে হবে তা জেএস কীভাবে সিদ্ধান্ত নেবে তা অনুধাবন করতে পারছি না Array.from()। উদাহরণস্বরূপ, নিম্নলিখিত ইমোজি 👍 lengthএর 2 টি রয়েছে, কারণ এটি দুটি কোড পয়েন্ট দিয়ে তৈরি, তবে, Array.from()এই দুটি কোড পয়েন্টকে এক হিসাবে বিবেচনা করে, একটি উপাদান দিয়ে অ্যারে দেয়:

const emoji = '👍';
console.log(Array.from(emoji)); // Output: ["👍"]

তবে কিছু অন্যান্য অক্ষরেরও দুটি কোড পয়েন্ট রয়েছে যেমন এই অক্ষরটির षि(এর একটিতে .length2 এরও একটি সংখ্যা রয়েছে)। তবে Array.fromএই চরিত্রটি "গোষ্ঠী" করে না এবং এর পরিবর্তে দুটি উপাদান তৈরি করে:

const str = 'षि';
console.log(Array.from(str)); // Output: ["ष", "ि"]

আমার প্রশ্নটি: চরিত্রটি দুটি কোড পয়েন্ট নিয়ে গঠিত যখন চরিত্রটি ভেঙে গেছে (উদাহরণস্বরূপ দুটি উদাহরণস্বরূপ) বা একটি একক উপাদান হিসাবে বিবেচিত হয় তা কী নির্ধারণ করে?


5
ইউটিএফ -16 সারোগেট
জোড়গুলি একবার দেখুন


1
আমার এমডিএন এর অ্যারি.ফ্রিমের পলিফিল সম্পর্কে একটি উদ্বেগ আছে, যার আলাদা আচরণ রয়েছে: -স
ইলে

1
@ সমস্ত এটি কেবলমাত্র সাথে সম্পর্কিত বিষয়গুলি বিবেচনা করে length। ইটারেটর বা এমনকি Setএটির সাথেও কাজ করে না
আদিগা

উত্তর:


26

Array.fromপ্রথমে আর্গুমেন্টটির পুনরুক্তি করার চেষ্টা করে যদি এটির একটি থাকে এবং স্ট্রিংগুলিতে পুনরাবৃত্ত থাকে, সুতরাং এটি আহ্বান জানায় String.prototype[Symbol.iterator], তাই প্রোটোটাইপ পদ্ধতিটি কীভাবে কাজ করে তা দেখা যাক। এটি এখানে স্পেসিফিকেশন বর্ণিত :

  1. ওকে থাকতে দাও? প্রয়োজনীয়ObjectCoercible (এই মান)।
  2. চল করি ? ToString (O) টি।
  3. ক্রিয়েটস্ট্রিংটাইটার (এস) ফিরুন।

CreateStringIteratorঅবশেষে সন্ধান করা আপনাকে নিয়ে যায় 21.1.5.2.1 %StringIteratorPrototype%.next ( ), যা করে:

  1. সিপি হতে দিন! CodePointAt (গুলি, অবস্থান)
  2. ফলাফল স্ট্রিং সিপি যুক্ত স্ট্রিং মান হতে দিন। [[CodeUnitCount]] সূচি পজিশনে কোড ইউনিট দিয়ে শুরু থেকে পরপর কোড ইউনিট।
  3. ওকে [[স্ট্রিংনেেক্সটেক্স ইনডেক্স]] + সিপি পজিশনে সেট করুন [[[কোডউনিটকাউন্ট]]।
  4. CreateIterResultObject (ফলাফল স্ট্রিং, মিথ্যা) রিটার্ন করুন।

CodeUnitCountকি আপনি আগ্রহী করছি এই সংখ্যা থেকে আসে। CodePointAt :

  1. প্রথমে স্ট্রিংয়ের মধ্যে সূচী অবস্থানে কোড ইউনিট হওয়া যাক।
  2. সিপিকে সেই কোড পয়েন্ট হতে দেওয়া যাক এর সংখ্যার মানটি প্রথমে that
  3. প্রথমে যদি অগ্রণী সার্গেট বা ট্রেলিং সারোগেট না হয়, তবে

    ক। রেকর্ডটি ফিরিয়ে দিন { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }

  4. প্রথমটি যদি পিছনের সারোগেট বা অবস্থান + 1 = আকার হয়, তবে

    { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }। দ্য রেকর্ড ।

  5. দ্বিতীয় স্ট্রিংয়ের মধ্যে সূচি পজিশনে কোড ইউনিট হতে দিন।

  6. যদি দ্বিতীয়টি কোনও পিছনের সারোগেট না হয় তবে

    ক। রেকর্ডটি ফিরিয়ে দিন { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }

  7. সিপি সেট করুন! ইউটিএফ 16 ডিকোডসুরোগেট পেয়ার (প্রথম, দ্বিতীয়)।

  8. রেকর্ডটি ফিরিয়ে দিন { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }

সুতরাং, যখন কোনও স্ট্রিং দিয়ে পুনরাবৃত্তি হয়, তখন Array.fromকেবল 2 এর কোডইউনিটকাউন্ট ফেরত দেয় যখন প্রশ্নে থাকা অক্ষরটি একটি সারোগেট জুটির সূচনা হয়। চরিত্রগুলি যা সারোগেট জোড়া হিসাবে ব্যাখ্যা করা হয় এখানে বর্ণিত হয়েছে :

এই ধরনের ক্রিয়াকলাপ 0xD800 থেকে 0xDBFF (ইউনিকোড স্ট্যান্ডার্ড দ্বারা নেতৃস্থানীয় সারোগেট হিসাবে সংজ্ঞায়িত বা আরও আনুষ্ঠানিকভাবে একটি উচ্চ-সারোগেট কোড ইউনিট হিসাবে সংজ্ঞায়িত) এবং সংখ্যার মান সহ প্রতিটি কোড ইউনিট সহ প্রতিটি কোড ইউনিটে বিশেষ চিকিত্সা প্রয়োগ করে নিম্নলিখিত বিধিগুলি ব্যবহার করে 0xD0000 থেকে 0xDFFF (একটি পিছনের সারোগেট হিসাবে সংজ্ঞায়িত বা আরও আনুষ্ঠানিকভাবে নিম্ন-সারোগেট কোড ইউনিট হিসাবে সংজ্ঞায়িত) অন্তর্ভুক্ত রয়েছে::

षि কোনও সারোগেট জুটি নয়:

console.log('षि'.charCodeAt()); // First character code: 2359, or 0x937
console.log('षि'.charCodeAt(1)); // Second character code: 2367, or 0x93F

তবে 👍এর চরিত্রগুলি হ'ল:

console.log('👍'.charCodeAt()); // 55357, or 0xD83D
console.log('👍'.charCodeAt(1)); // 56397, or 0xDC4D

প্রথম চরিত্রের কোড '👍'হেক্সে, ডি 83 ডি, যা 0xD800 to 0xDBFFনেতৃস্থানীয় সারোগেটের সীমার মধ্যে । বিপরীতে, প্রথম অক্ষরের কোডটি 'षि'অনেক কম, এবং হয় না। সুতরাং 'षि'পৃথক পৃথক হয়ে যায়, কিন্তু '👍'না।

षिদুটি পৃথক অক্ষর দ্বারা গঠিত হয়: , দেবনাগরী পত্র SSA , এবং ि, দেবনাগরী স্বরবর্ণ আমি সাইন ইন করুন । এই ক্রমে একে অপরের পাশে থাকাকালীন, তারা দুটি পৃথক অক্ষরের সমন্বয়ে সজ্জিতভাবে গ্রাফিকভাবে একক অক্ষরে একত্রিত হয়।

বিপরীতে, 👍 কেবলমাত্র একক গ্লাইফ হিসাবে একসাথে যখন অক্ষর কোডগুলি বোঝায়। আপনি যদি অন্যটি ছাড়া কোড পয়েন্টের সাথে একটি স্ট্রিং ব্যবহার করার চেষ্টা করেন তবে আপনি একটি বাজে প্রতীক পাবেন:

console.log('👍'[0]);
console.log('👍'[1]);


10
আমি মনে করি যে বেশিরভাগ সঠিক, কার্যকর এবং সাবধানতার সাথে প্রদত্ত উদ্ধৃতি দিয়ে এই উত্তর দুটি ক্ষেত্রে পার্থক্যটির মূল পার্থক্য পরিষ্কারভাবে ব্যাখ্যা করতে ব্যর্থ হয়েছে: ইউনিকোড দৃষ্টিকোণ থেকে, षिআসলে দুটি অক্ষরই আলাদা আলাদা কোড পয়েন্ট সহ একক গঠনের জন্য গ্লাইফ (একটি বিমূর্ত চরিত্র, যেমন মানুষ বোঝে) এটি 👍ইমোজি এর বিপরীতে , যা নিজের এবং সম্পূর্ণরূপে একটি সম্পূর্ণ চরিত্র, যদিও এর কোড পয়েন্টটি যথেষ্ট বেশি যে এটি একটি সারোগেট জোড়ায় বিভক্ত হতে হয়েছিল। আমি বিশ্বাস করি যে স্পষ্ট করে দেওয়া যা এটির (অন্যথায় মূল্যবান) অনেক উত্তর দিতে পারে।
গেন্ডার

বিশেষত, ব্যঞ্জনবর্ণ ṣ (and) এবং স্বরলি (i) গ্রাফিকভাবে সংক্ষিপ্তাক্ষরে মিলিত হয় (ṣi)
আমদান

"Er" এ কেবলমাত্র একটি কোড পয়েন্ট আছে এটি এই উত্তরের পরিভাষাটি ভুল হতে পারে বলে প্রস্তাব করে।
বেন অ্যাস্টন

13

ইউটিএফ -16 (জেএসে স্ট্রিংয়ের জন্য ব্যবহৃত এনকোডিং) 16 বিট ইউনিট ব্যবহার করে। সুতরাং 15 বিট ব্যবহার করে প্রতিনিধিত্ব করা যায় এমন প্রতিটি ইউনিকোডকে একটি কোড পয়েন্ট হিসাবে উপস্থাপন করা হয়, অন্য দুটি জিনিস যা সারোগেট জোড়া হিসাবে পরিচিত । স্ট্রিং পুনরুক্তিকারীর কোড পয়েন্ট বেশি iterates।

উইকিপিডিয়ায় UTF-16


8

এটি অক্ষরের পিছনে কোড সম্পর্কে। কিছু দুটি বাইটে (ইউটিএফ -16) কোড করা হয় এবং Array.fromদুটি অক্ষর দ্বারা ব্যাখ্যা করা হয়। অক্ষরের তালিকাটি পরীক্ষা করতে হবে:

http://www.fileformat.info/info/charset/UTF-8/list.htm

http://www.fileformat.info/info/charset/UTF-16/list.htm

function displayHexUnicode(s) {
  console.log(s.split("").reduce((hex,c)=>hex+=c.charCodeAt(0).toString(16).padStart(4,"0"),""));
}

displayHexUnicode('षि');

console.log(Array.from('षि').forEach(x => displayHexUnicode(x)));


function displayHexUnicode(s) {
  console.log(s.split("").reduce((hex,c)=>hex+=c.charCodeAt(0).toString(16).padStart(4,"0"),""));
}

displayHexUnicode('👍');

console.log(Array.from('👍').forEach(x => displayHexUnicode(x)));


হেক্স কোডটি প্রদর্শন করে এমন ফাংশনের জন্য:

জাভাস্ক্রিপ্ট: ইউনিকোড স্ট্রিং থেকে হেক্স

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.