UTF-16 স্থির-প্রস্থ বা পরিবর্তনশীল-প্রস্থ? ইউটিএফ -8 এর বাই-অর্ডার সমস্যা নেই কেন?


16
  1. UTF-16 স্থির-প্রস্থ বা পরিবর্তনশীল-প্রস্থ? আমি বিভিন্ন উত্স থেকে বিভিন্ন ফলাফল পেয়েছি:

    Http://www.tbray.org/ongoing/Wen/200x/2003/04/26/UTF থেকে :

    ইউটিএফ -16 ইউনিকোড অক্ষর ষোল-বিট খণ্ডে সঞ্চয় করে।

    Http://en.wikedia.org/wiki/UTF-16/UCS-2 থেকে :

    ইউটিএফ -16 (16-বিট ইউনিকোড ট্রান্সফর্মেশন ফর্ম্যাট) ইউনিকোডের জন্য একটি অক্ষর এনকোডিং যা 1,112,064 [1] নম্বরগুলি (কোড পয়েন্ট বলে) 0 থেকে 0x10FFF এ ইউনিকোড কোড স্পেসে এনকোডিং করতে সক্ষম। এটি কোড বিন্দুতে এক বা দুটি 16-বিট কোড ইউনিটের একটি চলক-দৈর্ঘ্যের ফলাফল উত্পাদন করে।

  2. প্রথম উত্স থেকে

    ইউটিএফ -8 এরও সুবিধা রয়েছে যে এনকোডিংয়ের ইউনিট বাইট হয়, তাই কোনও বাইট-অর্ডার করার সমস্যা নেই।

    ইউটিএফ -8 এর বাই-অর্ডার সমস্যা নেই কেন? এটি ভেরিয়েবল-প্রস্থের, এবং একটি চরিত্রে একাধিক বাইট থাকতে পারে, তাই আমার মনে হয় বাইট-অর্ডার এখনও সমস্যা হতে পারে?

ধন্যবাদান্তে!


উত্তর:


13

(1) বাইট সিকোয়েন্স বলতে কী বোঝায়, সি তে একটি অ্যারে? ইউটিএফ -16 একটি বাইট সিকোয়েন্স বা এটি তখন কী? (২) বাইট সিকোয়েন্সের পরিবর্তনশীল দৈর্ঘ্যের সাথে কোনও সম্পর্ক নেই কেন?

আপনি এন্ডিয়ান সমস্যাগুলি কী তা বোঝা যাচ্ছে বলে মনে হচ্ছে। এখানে একটি সংক্ষিপ্তসার।

একটি 32-বিট পূর্ণসংখ্যা 4 বাইট নেয় takes এখন, আমরা এই বাইটগুলির যৌক্তিক ক্রম জানি know আপনার যদি 32-বিট পূর্ণসংখ্যা থাকে তবে আপনি নীচের কোড সহ এর উচ্চ বাইটটি পেতে পারেন:

uint32_t value = 0x8100FF32;
uint8_t highByte = (uint8_t)((value >> 24) & 0xFF); //Now contains 0x81

সব ঠিক আছে এবং ভাল। সমস্যাটি যেখানে শুরু হয় তা হ'ল বিভিন্ন হার্ডওয়্যার কীভাবে মেমরি থেকে পূর্ণসংখ্যার সঞ্চয় করে।

বিগ এন্ডিয়ান ক্রমানুসারে, আপনি 32-বিট সংখ্যার হিসাবে যে 4 মাইট মেমরি পড়েছেন তা প্রথম বাইটটি উচ্চ বাইট হওয়ার সাথে পড়বে:

[0][1][2][3]

লিটল এন্ডিয়ান অর্ডারে, আপনি 32-বিট ইন্টিজার হিসাবে যে 4 মাইট মেমরি পড়েছেন তা প্রথম বাইটটি লো বাইট হওয়ার সাথে পড়বে :

[3][2][1][0]

আপনার যদি 32-বিট মানটির একটি পয়েন্টারটিতে একটি পয়েন্টার থাকে তবে আপনি এটি করতে পারেন:

uint32_t value = 0x8100FF32;
uint32_t *pValue = &value;
uint8_t *pHighByte = (uint8_t*)pValue;
uint8_t highByte = pHighByte[0]; //Now contains... ?

সি / সি ++ অনুসারে এর ফলাফল অপরিবর্তিত। এটি 0x81 হতে পারে। অথবা এটি 0x32 হতে পারে। প্রযুক্তিগতভাবে, এটি কোনও কিছু ফিরিয়ে দিতে পারে তবে বাস্তব সিস্টেমগুলির জন্য এটি এক বা অন্যটিতে ফিরে আসবে।

আপনার যদি কোনও মেমরি ঠিকানার পয়েন্টার থাকে তবে আপনি সেই ঠিকানাটি 32-বিট মান, 16-বিট মান, বা 8-বিট মান হিসাবে পড়তে পারেন। একটি বড় এন্ডিয়ান মেশিনে, পয়েন্টারটি উচ্চ বাইটের দিকে নির্দেশ করে; একটু এন্ডিয়ান মেশিনে, পয়েন্টারটি নিম্ন বাইটের দিকে নির্দেশ করে।

মনে রাখবেন যে এটি মেমরি থেকে / পাঠানো এবং লেখার বিষয়ে। এর অভ্যন্তরীণ সি / সি ++ কোডের সাথে কোনও সম্পর্ক নেই । কোডটির প্রথম সংস্করণ, যা সি / সি ++ অপরিবর্তিত হিসাবে ঘোষণা করে না, উচ্চ বাইট পেতে সর্বদা কাজ করবে ।

সমস্যাটি যখন আপনি বাইট স্ট্রিমগুলি পড়া শুরু করেন। যেমন একটি ফাইল থেকে।

16-বিট মানগুলিতে 32-বিট মান হিসাবে একই সমস্যা রয়েছে; 4 এর পরিবর্তে তাদের কেবল 2 বাইট রয়েছে Therefore সুতরাং, কোনও ফাইলে বড় এন্ডিয়ান বা সামান্য এন্ডিয়ান অর্ডারে সঞ্চিত 16-বিট মান থাকতে পারে।

ইউটিএফ -16 16 বিট মানগুলির ক্রম হিসাবে সংজ্ঞায়িত করা হয়েছে । কার্যকরভাবে, এটি একটি uint16_t[]। প্রতিটি স্বতন্ত্র কোড ইউনিট একটি 16-বিট মান। সুতরাং, ইউটিএফ -16 যথাযথভাবে লোড করার জন্য আপনাকে অবশ্যই জানতে হবে যে ডেটাটির এন্ডিয়ান-নেসটি।

ইউটিএফ -8 8 বিট মানগুলির ক্রম হিসাবে সংজ্ঞায়িত করা হয় । এটি একটি uint8_t[]। প্রতিটি স্বতন্ত্র কোড ইউনিট 8-বিট আকারের: একক বাইট।

এখন, উভয় হল UTF-16 এবং হল UTF-8 একাধিক কোড ইউনিট (16 বিট বা 8-বিট মান) একসঙ্গে মেশা করার জন্য একটি ইউনিকোড কোডপয়েন্ট (একটি "চরিত্র" গঠন করতে, কিন্তু যে জন্য অনুমতি না এটা একটা সরলীকৃত ব্যবস্থা; সঠিক শব্দটি )। অর্ডার এই কোড ইউনিট করে একটি কোডপয়েন্ট গঠন হল UTF-16 এবং হল UTF-8 এনকোডিং দ্বারা dictated করা হয়।

ইউটিএফ -16 প্রক্রিয়াকরণ করার সময়, আপনি 16-বিট মান পড়েন, এন্ডিয়ান রূপান্তরটি যা প্রয়োজন তা-ই করে। তারপরে, আপনি সনাক্ত করতে পারেন যে এটি কোনও সারোগেট জুটি কিনা; যদি এটি হয় তবে আপনি অন্য 16-বিট মানটি পড়বেন, দুটি একত্রিত করুন এবং সেখান থেকে আপনি ইউনিকোড কোডপয়েন্ট মান পাবেন।

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

সুতরাং ইউটিএফ -8 এর সাথে কোনও এন্ডিয়ান সমস্যা থাকতে পারে না।


10

জেরেমি ব্যাংকগুলির উত্তর যতদূর যায় সঠিক, তবে বাইট ক্রমটি সম্বোধন করেনি।

আপনি যখন ইউটিএফ -১ use ব্যবহার করেন, সর্বাধিক গ্লিফগুলি একটি দ্বি-বাইট শব্দের সাহায্যে সংরক্ষণ করা হয় - তবে শব্দটি যখন ডিস্ক ফাইলে সংরক্ষণ করা হয়, তখন আপনি উপাদানটি বাইট সংরক্ষণ করার জন্য কোন আদেশটি ব্যবহার করবেন?

উদাহরণস্বরূপ, "জল" শব্দের জন্য সিজেকে (চাইনিজ) গ্লাইফের 6 সি 34 এর হেক্সাডেসিমেলটিতে একটি ইউটিএফ -16 এনকোডিং রয়েছে। আপনি যখন এটি ডিস্কে দুটি বাইট হিসাবে লেখেন, আপনি কি এটি "বিগ-এন্ডিয়ান" (দুটি বাইট 6C 34) হিসাবে লেখেন? অথবা আপনি কি "লিটল-এন্ডিয়ান (দুটি বাইট 34 ডিগ্রি সেন্টিগ্রেড) হিসাবে লেখেন?

ইউটিএফ -১ With এর সাথে উভয় আদেশই বৈধ এবং আপনি সাধারণত ফাইলটি কোনটি বাইট অর্ডার মার্ক (বিওএম) তৈরি করে তা নির্দেশ করেন যা বিগ-এন্ডিয়ান এনকোডিংয়ের জন্য ফি এফএফ, এবং ছোট-এন্ডিয়ানদের জন্য এনকোডিং হ'ল এফএফ ফে।

ইউটিএফ -32 এর একই সমস্যা এবং একই সমাধান রয়েছে।

ইউটিএফ -8 এর সমস্যা নেই, কারণ এটির দৈর্ঘ্য দৈর্ঘ্য এবং আপনি কার্যকরভাবে একটি গ্লাইফের বাইট ক্রমটি লিখুন যেন এটি ছোট-এন্ডিয়ান। উদাহরণস্বরূপ, "পি" অক্ষরটি সর্বদা একটি বাইট - 80 ব্যবহার করে এনকোড করা থাকে এবং প্রতিস্থাপনের অক্ষরটি সর্বদা সেই ক্রমে দুটি বাইট এফএফ এফডি ব্যবহার করে এনকোড থাকে।

কিছু প্রোগ্রাম একটি ইউটিএফ -8 ফাইল শুরু করার সময় একটি তিন-বাইট সূচক (EF বিবি বিএফ) রাখে এবং এটি ইউএসএফ -8 কে এএসসিআইআই এর মতো অনুরূপ এনকোডিং থেকে আলাদা করতে সহায়তা করে, তবে এমএস উইন্ডোজ ব্যতীত এটি খুব সাধারণ নয় not


ধন্যবাদ! (1) "পি" অক্ষরটি ইউটিএফ -8 এ কেবল একটি বাইট। প্রতিস্থাপনের চরিত্রটি কেন তার কোডটিতে যুক্ত হয়? (2) ইউটিএফ -8 এ, অন্যান্য অক্ষর রয়েছে যা ইউটিএফ -8 এ একাধিক বাইট রয়েছে। এই জাতীয় প্রতিটি চরিত্রের বাইটের মধ্যে বাইট-অর্ডার কেন একটি সমস্যা নয়?
59-এ সমস্ত স্ট্যাক এক্সচেঞ্জ

@ টিম: (1) আপনি পি এর কোডটিতে প্রতিস্থাপনের অক্ষর যুক্ত করবেন না you আপনি যদি 80 এফএফ এফডি দেখতে পান তবে এটি দুটি অক্ষর - একটি পি অক্ষর এবং একটি প্রতিস্থাপন অক্ষর।
বব মারফি

(২) আপনি সর্বদা "ক্রম প্রতিস্থাপনের অক্ষর" এর জন্য দুটি বাইট এফএফ এফডি হিসাবে লিখুন এবং পড়ুন, সেই ক্রমে। কেবলমাত্র বাইট-অর্ডারিংয়ের সমস্যা যদি আপনি "প্রতিস্থাপনের চরিত্র" এফডি এফএফ হিসাবে লিখতে পারেন - তবে আপনি পারবেন না; দুটি বাইটের ক্রমটি একটি "প্রতিস্থাপনের অক্ষর" ব্যতীত অন্য কিছু হবে।
বব মারফি

1
@Tim: আপনি মাধ্যমে কাজ করতে চাইতে পারেন en.wikipedia.org/wiki/UTF-8 । এটি সত্যিই বেশ ভাল এবং আপনি যদি এগুলি এবং ইউনিকোড-সম্পর্কিত অন্যান্য উইকিপিডিয়া পৃষ্ঠাগুলি সমস্ত বুঝতে পারেন তবে আমি মনে করি এটি সম্পর্কে আপনার আর কোনও প্রশ্ন নেই have
বব মারফি

4
ইউটিএফ -8 বাইট অর্ডার নিয়ে কোনও সমস্যা না করার কারণটি হ'ল এনকোডিংটি বাইট ক্রম হিসাবে সংজ্ঞায়িত করা হয় এবং বিভিন্ন প্রান্তিকতার সাথে কোনও প্রকরণ নেই। পরিবর্তনশীল দৈর্ঘ্যের সাথে এর কোনও যোগসূত্র নেই।
স্টার ব্লু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.