ইউটিএফ -8 "ভেরিয়েবল-প্রস্থের এনকোডিং" কীভাবে কাজ করে?


110

ইউনিকোড স্ট্যান্ডার্ডটিতে পর্যাপ্ত কোড-পয়েন্ট রয়েছে যেগুলি সমস্ত সংরক্ষণ করার জন্য আপনার 4 বাইট প্রয়োজন। এটি ইউটিএফ -32 এনকোডিংটি করে। তবুও ইউটিএফ -8 এনকোডিং কোনওভাবে "ভেরিয়েবল-প্রস্থের এনকোডিং" নামক কিছু ব্যবহার করে এগুলিকে অনেক ছোট স্পেসে আটকায়।

প্রকৃতপক্ষে, এটি ইউএস-এএসসিআইআইয়ের প্রথম 127 টি অক্ষরকে কেবল একটি বাইটে উপস্থাপন করতে সক্ষম করে যা দেখতে একেবারে আসল এএসসিআইআই এর মতো লাগে, তাই আপনি অনেকগুলি এসসিআই পাঠ্যটি ব্যাখ্যা করতে পারেন যেন এটি কিছু না করেই ইউটিএফ -8 ছিল। নিখুঁত কৌশল. সুতরাং কিভাবে এটি কাজ করে?

আমি এখানে আমার নিজের প্রশ্নটি জিজ্ঞাসা করতে এবং উত্তর দিতে যাচ্ছি কারণ এটি বের করার জন্য আমি কেবল কিছুটা পড়া করেছি এবং আমি ভেবেছিলাম এটি হয়ত অন্য কাউকে কিছুটা সময় সাশ্রয় করতে পারে। প্লাস হয়তো কেউ আমার সংশোধন করতে পারে যদি আমি এর কিছু ভুল করে ফেলেছি।


8
স্ট্রেইট ইউনিকোডের সমস্ত কোড পয়েন্ট এনকোড করতে 32 বিট লাগবে না । তারা একবারে অনেকগুলি সম্ভাব্য কোড পয়েন্টের কাছে দাবি জানায়, কিন্তু ইউটিএফ -8 ছাড়ার পরে তারা ইচ্ছাকৃতভাবে নিজেকে 21 বিটের মধ্যে সীমাবদ্ধ করে রাখে, যাতে ইউটিএফ -8 অক্ষর প্রতি 4 বাইটের বেশি কখনই না পারে। ইউনিকোডে বর্তমানে সমস্ত সম্ভাব্য কোড পয়েন্ট ধরে রাখতে কেবল 17 টি বিট প্রয়োজন। এই সীমাবদ্ধতা ছাড়াই, ইউটিএফ -8 চরিত্র অনুসারে 6 বাইটে যেতে পারত।
ওয়ারেন ইয়ং

@ ওয়ারেন: বেশিরভাগই সঠিক, তবে ইউনিকোড একটি 21-বিট কোড (U + 0000 থেকে U + 10FFFF)।
জোনাথন লেফলার

2
@ ওয়ারেন: 4-বাইট-সীমাবদ্ধ ইউটিএফ -8 U + 1FFFFF পর্যন্ত সমর্থন করতে পারে। U + 10FFFF- এর সীমাবদ্ধতা ইউটিএফ -16 এর স্বার্থে করা হয়েছিল।
dan04

@ dan04 এটি কীভাবে ইউটিএফ -16 দ্বারা ইউ + 10FFFF- এ সীমাবদ্ধ তা সম্পর্কে আমাদের কোনও সহজ ব্যাখ্যা আছে? এই সম্পর্কে আরও জানতে ভাল লাগবে।
এ-লেটব্বি

@ এ-লেটব্বি: কারণ ইউটিএফ -১ “" সারোগেট "কোডগুলি এমনভাবে বরাদ্দ করা হয়েছে যে সেখানে 1024 লিড সারোগেট এবং 1024 ট্রেইল সারোগেট রয়েছে (এবং এগুলি কেবল জোড়া হিসাবে ব্যবহার করা যেতে পারে), 2 ^ 20 (প্রায় এক মিলিয়ন) অতিরিক্ত অক্ষর তৈরি করতে বিএমপি ছাড়াই উপলব্ধ। বিএমপিতে উপলব্ধ 2 ^ 16 টি অক্ষর যুক্ত হয়েছে, এটি 0x110000 সম্ভাব্য অক্ষর তৈরি করে।
dan04

উত্তর:


129

প্রতিটি বাইট কয়েকটি বিট দিয়ে শুরু হয় যা আপনাকে জানায় এটি একক বাইট কোড-পয়েন্ট, একটি বহু-বাইট কোড পয়েন্ট, বা একাধিক বাইট কোড পয়েন্টের ধারাবাহিকতা। এটার মত:

0xxx xxxx    A single-byte US-ASCII code (from the first 127 characters)

মাল্টি-বাইট কোড-পয়েন্ট প্রতিটি সূচিত করে কয়েকটি বিট দিয়ে শুরু করে যা মূলত বলে "হেই, আমি কী তা জানার জন্য আপনাকে পরবর্তী বাইটও (বা দুটি, বা তিন) পড়তে হবে।" তারা হ'ল:

110x xxxx    One more byte follows
1110 xxxx    Two more bytes follow
1111 0xxx    Three more bytes follow

অবশেষে, সেই সূচনা কোডগুলি অনুসরণ করে এমন বাইটগুলি সমস্ত দেখতে এইরকম:

10xx xxxx    A continuation of one of the multi-byte characters

যেহেতু আপনি প্রথম কয়েকটি বিট থেকে আপনি কী ধরণের বাইটটি দেখছেন তা বলতে পারেন, তবে কোনও কিছু কোথাও মংগল হয়ে গেলেও আপনি পুরো ক্রমটি হারাবেন না।


14
গল্পটির চেয়ে আরও অনেক কিছু রয়েছে - কারণ এনকোডিংটি অবশ্যই চরিত্রটির জন্য সংক্ষিপ্ততম এনকোডিং হতে হবে, যার অর্থ শেষ হয় যে বাইটস 0xC0 এবং 0xC1 ইউটিএফ -8 এ উপস্থিত হতে পারে না, উদাহরণস্বরূপ; এবং, বাস্তবে, 0xF5..0xFF উভয়ই পারেনা। ইউএনএফএফ -8 এফএকিউ দেখুন ইউনিকোড.আরএফএএইচ / আউটফ_বম.এইচটিএমএল , বা ইউনিকোড.আর
জোনাথন লেফলার

2
কেন এটি বলতে একটি মাত্র চর ব্যবহার করতে পারেনি next char is continuation? আমরা যদি 3 বাইট চরিত্র পেয়েছি তবে এটির মতো 1xxxxxxx 1xxxxxxx 0xxxxxxxহবে:, তাই কম স্থান নষ্ট হবে।

9
@ সোয়াকু এটি ইউটিএফ -8 কে তথাকথিত "স্ব-সিঙ্ক্রোনাইজিং" কোড করে। এর অর্থ যদি ত্রুটির কারণে অনুক্রমের অংশগুলি অনুপস্থিত থাকে তবে এটি সনাক্ত করা এবং যা কিছু গণ্ডগোল হয়েছে তা ফেলে দেওয়া সম্ভব। আপনি যদি 10 xxx দিয়ে শুরু হওয়া কোনও বাইটটি পড়ে থাকেন এবং এর আগে কোনও "শুরু" বাইট নেই, আপনি এটিকে অর্থহীন বলে তা বাতিল করতে পারেন। আপনার বর্ণনার মতো সিস্টেম যদি থাকে এবং প্রথম বাইটগুলির মধ্যে একটি হারিয়ে যায় তবে আপনি কোনও ভিন্ন ত্রুটির কোনও ইঙ্গিত ছাড়াই একটি ভিন্ন, বৈধ অক্ষর দিয়ে শেষ করতে পারেন। এটি পরবর্তী বৈধ চরিত্রটি সনাক্ত করা সহজ করার পাশাপাশি "ধারাবাহিকতা" বাইটগুলি হারিয়ে যাওয়ার জন্যও সঠিক করে তুলবে।
htmlcoderexe

9

আরএফসি 3629 - ইউটিএফ -8, আইএসও 10646 এর রূপান্তর ফর্ম্যাটটি এখানে চূড়ান্ত কর্তৃপক্ষ এবং এর সমস্ত ব্যাখ্যা রয়েছে।

সংক্ষেপে, ইউটিএফ-8-এনকোডড 1-থেকে-4-বাইট ক্রমের প্রতিটি বাইটের একক অক্ষরকে উপস্থাপন করে এটি কোনও ট্রাইলিং বাইট, একটি শীর্ষস্থানীয় বাইট এবং যদি তা হয় তবে কতগুলি বাইট অনুসরণ করে তা নির্ধারণ করতে ব্যবহৃত হয়। বাকী বিটগুলিতে পে-লোড থাকে।


1
উম্ম্ম, মূর্খ, আমি ভেবেছিলাম ইউটিএফ -8-তে ইউনিকোড স্ট্যান্ডার্ডই চূড়ান্ত কর্তৃপক্ষ
জন মাচিন

6
ইউনিকোড স্ট্যান্ডার্ড ইউনিকোডকেই সংজ্ঞায়িত করে। এটি আজ এবং ভবিষ্যতের বিভিন্ন পদ্ধতির সংজ্ঞা দেয় না যা বিভিন্ন উদ্দেশ্যে ইউনিকোড পাঠগুলি এনকোড করতে ব্যবহার করা যেতে পারে (যেমন সঞ্চয় এবং পরিবহন)। ইউটিএফ -8 হ'ল সেই পদ্ধতিগুলির মধ্যে একটি এবং উপরোক্ত রেফারেন্সটি ডকুমেন্টকে এটি সংজ্ঞায়িত করে।
আজেগ্লোভ

1
আরএফসি 3629, পৃষ্ঠা 3, বিভাগ 3 বলছে "ইউটিএফ -8 ইউনিকোড স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয়েছে"।
জন মাচিন

ইউনিকোড.অর্গ.এর লিঙ্কগুলি তাড়া করে আমাকে ইউনিকোড স্ট্যান্ডার্ডের 3.9 বিভাগে এবং বিশেষত সংজ্ঞা D92 (এবং স্পর্শকাতরভাবে D86) এ নিয়ে যায়। নতুন সংস্করণ প্রকাশিত হলে এই লিঙ্কটি কী পরিমাণে কার্যকর হবে সে সম্পর্কে আমার ধারণা নেই তবে আমি ধারণা করব যে তারা বিভাগ এবং সংজ্ঞা শনাক্তকারীদের সংস্করণগুলিতে স্থিত রাখতে চান।
ট্রিপলি

4

ইউটিএফ -8 হ'ল আপনার ইউনিকোড কোড পয়েন্টগুলির স্ট্রিং, সেই ম্যাজিক ইউ + নম্বরগুলি, 8 বিট বাইট ব্যবহার করে মেমরির সঞ্চয় করার জন্য আরেকটি সিস্টেম। ইউটিএফ -8 এ, 0-127 এর প্রতিটি কোড পয়েন্ট একক বাইটে সঞ্চয় করা হয়। কেবলমাত্র 128 বা উপরে কোড পয়েন্টগুলি 2, 3 ব্যবহার করে সংরক্ষণ করা হয়, বাস্তবে 6 বাইট পর্যন্ত।

নিখুঁত ন্যূনতম প্রতিটি সফ্টওয়্যার বিকাশকারী এর অবলম্বন, ইউনিকোড এবং চরিত্রের সেটগুলি সম্পর্কে অবশ্যই ইতিবাচকভাবে জানতে হবে (কোনও বাহানা নেই!)


এটি একটি ভাল নিবন্ধ, তবে মনে হচ্ছে ক্রমটির সর্বোচ্চ দৈর্ঘ্য সম্পর্কে জোয়েল ভুল el উইকিপিডিয়া পৃষ্ঠাটি কেবল অক্ষর অনুযায়ী ১.৪ বাইট দেখায়।
বিনোদন

4
যেমন আমি আগেই বলেছি, ইউটিএফ -8 যখন প্রথম তৈরি হয়েছিল, তখন ইউনিকোড কোড পয়েন্টগুলির জন্য 32-বিট পর্যন্ত দাবি দাবি করেছিল, কারণ সত্যই এটির প্রয়োজন ছিল না, কেবল 32-বিট একটি সুবিধাজনক মান বলে এবং তারা ইতিমধ্যে অতীতকে উড়িয়ে দিয়েছিল পূর্ববর্তী 16-বিট অক্ষরের সীমা। ইউটিএফ -8 জনপ্রিয় প্রমাণিত হওয়ার পরে, তারা সর্বকালের কোড পয়েন্টগুলির সর্বাধিক সংখ্যা 2 ^ 21-এ সীমাবদ্ধ করে বেছে নিয়েছে, যে ইউটিএফ -8 প্রকল্পের 4 বাইটের সাহায্যে আপনি এনকোড করতে পারবেন সবচেয়ে বড় মান। ইউনিকোডে এখনও 2 ^ 17 টিরও কম অক্ষর রয়েছে, তাই আমরা এই নতুন স্কিমের সাহায্যে ইউনিকোডে অক্ষরের সংখ্যাকে চারগুণ বেশি করতে পারি।
ওয়ারেন ইয়ং

ঠিক আছে তবে ওপি কর্তৃক জিজ্ঞাসিত ব্যাখ্যা নয়।
নিশান্ত

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