ইউটিএফ -8, ইউটিএফ -16, এবং ইউটিএফ -32 এর মধ্যে পার্থক্য কী?
আমি বুঝতে পারি যে তারা সকলেই ইউনিকোড সঞ্চয় করবে এবং প্রত্যেকটি একটি চরিত্র উপস্থাপন করতে আলাদা আলাদা সংখ্যক বাইট ব্যবহার করে। একে অপরকে বেছে নেওয়ার সুবিধা কি?
ইউটিএফ -8, ইউটিএফ -16, এবং ইউটিএফ -32 এর মধ্যে পার্থক্য কী?
আমি বুঝতে পারি যে তারা সকলেই ইউনিকোড সঞ্চয় করবে এবং প্রত্যেকটি একটি চরিত্র উপস্থাপন করতে আলাদা আলাদা সংখ্যক বাইট ব্যবহার করে। একে অপরকে বেছে নেওয়ার সুবিধা কি?
উত্তর:
ইউটিএফ -8 এর ক্ষেত্রে একটি সুবিধা রয়েছে যেখানে ASCII অক্ষরগুলি পাঠ্যের একটি ব্লকে সর্বাধিক অক্ষরের প্রতিনিধিত্ব করে, কারণ UTF-8 এগুলিকে 8 টি বিটে এনকোড করে (যেমন ASCII)। এটিতেও সুবিধাজনক যে কেবলমাত্র ASCII অক্ষর সমন্বিত কোনও UTF-8 ফাইলের ASCII ফাইলের মতোই এনকোডিং থাকে।
ইউটিএফ -16 আরও ভাল যেখানে এএসসিআইআই প্রাধান্য পায় না, কারণ এটি প্রাথমিকভাবে চরিত্র অনুযায়ী 2 বাইট ব্যবহার করে। ইউটিএফ -8 উচ্চতর অর্ডার অক্ষরের জন্য 3 বা ততোধিক বাইট ব্যবহার শুরু করবে যেখানে বেশিরভাগ অক্ষরের জন্য ইউটিএফ -16 মাত্র 2 বাইটে রয়ে গেছে।
UTF-32 4 টি বাইটে সমস্ত সম্ভাব্য অক্ষর কভার করবে। এটি একেবারে ফুলে যায়। আমি এটি ব্যবহার করে কোনও লাভের কথা ভাবতে পারি না।
সংক্ষেপে:
দীর্ঘ সময়: উইকিপিডিয়া: ইউটিএফ -8 , ইউটিএফ -16 এবং ইউটিএফ -32 দেখুন ।
wchar_t
4 বাইটের ডিফল্ট হয়। জিসিসির একটি বিকল্প রয়েছে -fshort-wchar
যা আকারটি 2 বাইটে হ্রাস করে, তবে স্ট্যান্ড লিবসের সাথে বাইনারি সামঞ্জস্যতা ভেঙে দেয়।
UTF-8 পরিবর্তনশীল 1 থেকে 4 বাইট।
UTF-16 পরিবর্তনশীল 2 বা 4 বাইট।
ইউটিএফ -32 4 বাইট স্থির করা হয়েছে ।
দ্রষ্টব্য: ইউটিএফ -8 সর্বশেষ কনভেনশন সহ 1 থেকে 6 বাইট নিতে পারে: https://lists.gnu.org/archive/html/help-flex/2005-01/msg00030.html
ইউনিকোড প্রতিটি গ্রাফিকাল চিহ্নের জন্য একটি অনন্য পূর্ণসংখ্যার মান নির্ধারণ করে একটি একক বিশাল অক্ষর সেটকে সংজ্ঞায়িত করে (এটি একটি প্রধান সরলীকরণ, এবং আসলে সত্য নয়, তবে এটি এই প্রশ্নের উদ্দেশ্যগুলির জন্য যথেষ্ট নিকটবর্তী)। ইউটিএফ -8 / 16/32 এটিকে এনকোড করার সহজ উপায়।
সংক্ষেপে, UTF-32 প্রতিটি অক্ষরের জন্য 32-বিট মান ব্যবহার করে। এটি তাদের প্রতিটি চরিত্রের জন্য একটি নির্দিষ্ট-প্রস্থের কোড ব্যবহার করতে দেয়।
ইউটিএফ -১ ডিফল্টরূপে ১--বিট ব্যবহার করে তবে এটি আপনাকে কেবল k৫ কে সম্ভাব্য অক্ষর দেয় যা পুরো ইউনিকোড সেটের জন্য পর্যাপ্ত কোথাও নেই। সুতরাং কিছু অক্ষর 16-বিট মানগুলির জোড়া ব্যবহার করে।
এবং ইউটিএফ -8 ডিফল্টভাবে 8-বিট মানগুলি ব্যবহার করে যার অর্থ হল 127 প্রথম মানগুলি স্থির-প্রস্থের একক-বাইট অক্ষর (সবচেয়ে উল্লেখযোগ্য বিটটি বোঝাতে ব্যবহৃত হয় যে এটি 7-এ রেখে একাধিক-বাইট অনুক্রমের শুরু) প্রকৃত চরিত্রের মানের জন্য বিট)। অন্যান্য সমস্ত অক্ষর 4 বাইট অবধি ক্রম হিসাবে এনকোড করা হয়েছে (যদি মেমোরিটি দেয় তবে)।
এবং এটি আমাদের সুবিধার দিকে নিয়ে যায়। যে কোনও এএসসিআইআই-চরিত্র সরাসরি ইউটিএফ -8 এর সাথে সামঞ্জস্যপূর্ণ, সুতরাং উত্তরাধিকার অ্যাপ্লিকেশনগুলি আপগ্রেড করার জন্য, ইউটিএফ -8 একটি সাধারণ এবং সুস্পষ্ট পছন্দ। প্রায় সব ক্ষেত্রে এটি স্বল্পতম স্মৃতিও ব্যবহার করবে। অন্যদিকে, আপনি কোনও চরিত্রের প্রস্থ সম্পর্কে কোনও গ্যারান্টি দিতে পারবেন না। এটি 1, 2, 3 বা 4 টি অক্ষরের প্রশস্ত হতে পারে, যা স্ট্রিং ম্যানিপুলেশনকে শক্ত করে তোলে।
ইউটিএফ -32 এর বিপরীত, এটি সর্বাধিক মেমরি ব্যবহার করে (প্রতিটি অক্ষর একটি নির্দিষ্ট 4 বাইট প্রশস্ত), তবে অন্যদিকে, আপনি জানেন যে প্রতিটি চরিত্রের এই সুনির্দিষ্ট দৈর্ঘ্য থাকে, সুতরাং স্ট্রিং ম্যানিপুলেশন অনেক সহজ হয়ে যায়। আপনি স্ট্রিংয়ের অক্ষরের সংখ্যাটি স্ট্রিংয়ের বাইটের দৈর্ঘ্য থেকে সহজভাবে গণনা করতে পারেন। আপনি এটি ইউটিএফ -8 দিয়ে করতে পারবেন না।
ইউটিএফ -16 একটি আপস। এটি বেশিরভাগ অক্ষরকে একটি নির্দিষ্ট-প্রস্থের 16-বিট মানটিতে ফিট করতে দেয় । সুতরাং যতক্ষণ না আপনার কাছে চাইনিজ প্রতীক, বাদ্য নোট বা অন্য কিছু রয়েছে, আপনি ধরে নিতে পারেন যে প্রতিটি অক্ষর 16 বিট প্রশস্ত। এটি ইউটিএফ -32 এর চেয়ে কম মেমরি ব্যবহার করে। তবে এটি কিছু উপায়ে "উভয় বিশ্বের সবচেয়ে খারাপ"। এটি প্রায়শই ইউটিএফ -8 এর চেয়ে বেশি মেমরি ব্যবহার করে এবং এটি এখনও ইউটিএফ -8 (ভেরিয়েবল-দৈর্ঘ্যের অক্ষর) জর্জরিত সমস্যাটি এড়ায় না।
অবশেষে, প্ল্যাটফর্মটি কী সমর্থন করে তা নিয়ে যেতে প্রায়শই সহায়ক। উইন্ডোজ অভ্যন্তরীণভাবে ইউটিএফ -16 ব্যবহার করে, তাই উইন্ডোজেও এটি স্পষ্ট পছন্দ।
লিনাক্স কিছুটা পৃথক হয়, তবে তারা ইউনিকোড-আনুগত্যের জন্য সাধারণত ইউটিএফ -8 ব্যবহার করে।
সুতরাং সংক্ষিপ্ত উত্তর: তিনটি এনকোডিং একই অক্ষর সেটকে এনকোড করতে পারে তবে তারা প্রতিটি অক্ষরকে বিভিন্ন বাইট অনুক্রম হিসাবে উপস্থাপন করে।
ইউনিকোড একটি স্ট্যান্ডার্ড এবং ইউটিএফ-এক্স সম্পর্কে আপনি কিছু ব্যবহারিক উদ্দেশ্যে প্রযুক্তিগত বাস্তবায়ন হিসাবে ভাবতে পারেন:
আমি আমার ব্লগপোস্টে একটি সহজ ব্যাখ্যা দেওয়ার চেষ্টা করেছি ।
যে কোনও অক্ষরকে এনকোড করতে 32 বিট (4 বাইট) প্রয়োজন । উদাহরণস্বরূপ, এই স্কিমটি ব্যবহার করে "ক" অক্ষর কোড-পয়েন্ট উপস্থাপন করতে আপনাকে 32-বিট বাইনারি সংখ্যায় 65 লিখতে হবে:
00000000 00000000 00000000 01000001 (Big Endian)
আপনি যদি ঘনিষ্ঠভাবে নজর রাখেন তবে আপনি খেয়াল করতে পারেন যে ASCII স্কিমটি ব্যবহার করার সময় সর্বাধিক-ডানদিকের সাতটি বিট আসলে একই বিট are তবে যেহেতু ইউটিএফ -32 হয় নির্দিষ্ট প্রস্থের স্কিম , তাই আমাদের অবশ্যই তিনটি অতিরিক্ত বাইট সংযুক্ত করতে হবে। এর অর্থ হ'ল যদি আমাদের কাছে দুটি ফাইল থাকে যা কেবলমাত্র "এ" অক্ষর ধারণ করে, একটি ASCII- এনকোডযুক্ত এবং অন্যটি ইউটিএফ -32 এনকোডযুক্ত থাকে, তবে তাদের আকার 1 বাইট এবং 4 বাইট অনুসারে হবে।
অনেক লোক মনে করেন যে ইউটিএফ -32 কোনও কোড-পয়েন্ট উপস্থাপনের জন্য নির্দিষ্ট প্রস্থ 32 বিট ব্যবহার করে, ইউটিএফ -16 স্থির প্রস্থ 16 বিট হয়। ভুল!
ইউটিএফ -১ In এ কোড পয়েন্টটি সম্ভবত 16 বিট বা 32 বিটগুলিতে উপস্থাপিত হয়। সুতরাং এই স্কিমটি পরিবর্তনশীল দৈর্ঘ্যের এনকোডিং সিস্টেম। ইউটিএফ -32 এর চেয়ে সুবিধা কী? কমপক্ষে ASCII এর জন্য, ফাইলের আকার মূল (তবে এখনও দুবার) 4 গুণ হবে না, তাই আমরা এখনও ASCII পশ্চাদপটে সামঞ্জস্যপূর্ণ নই।
যেহেতু 7-বিটগুলি "এ" চরিত্রটির প্রতিনিধিত্ব করতে যথেষ্ট, তাই আমরা এখন ইউটিএফ -32 এর মতো 4 এর পরিবর্তে 2 বাইট ব্যবহার করতে পারি। এটি দেখতে দেখতে:
00000000 01000001
আপনি সঠিক অনুমান করেছেন .. ইউটিএফ -8 এ সম্ভবত 32, 16, 24 বা 8 বিট ব্যবহার করে এবং পয়েন্টটি ইউটিএফ -16 সিস্টেম হিসাবে কোড পয়েন্টটি উপস্থাপন করেছে, এটি একটি পরিবর্তনশীল দৈর্ঘ্যের এনকোডিং সিস্টেমও।
পরিশেষে আমরা ASCII এনকোডিং সিস্টেমটি ব্যবহার করে আমরা একইভাবে এটি উপস্থাপন করতে পারি:
01001101
চীনা অক্ষর "語" বিবেচনা করুন - এর ইউটিএফ -8 এনকোডিংটি হ'ল:
11101000 10101010 10011110
যদিও এর ইউটিএফ -16 এনকোডিং সংক্ষিপ্ত:
10001010 10011110
উপস্থাপনাটি এবং এটি কীভাবে ব্যাখ্যা করা হয়েছে তা বোঝার জন্য, আসল পোস্টটি দেখুন।
ইউটিএফ -8 সর্বাধিক স্থান দক্ষ হতে চলেছে যদি না বেশিরভাগ অক্ষর সিজেকে (চাইনিজ, জাপানি এবং কোরিয়ান) বর্ণচিহ্নের স্থান থেকে থাকে।
বাইট-অ্যারেতে অফসেট অক্ষর দ্বারা র্যান্ডম অ্যাক্সেসের জন্য ইউটিএফ -32 সেরা।
0xxxxxxx
বাইনারি রয়েছে। সমস্ত দ্বি-বাইট অক্ষর 110xxxxx
দ্বিতীয় বাইট দিয়ে শুরু হয় 10xxxxxx
। সুতরাং আসুন বলি যে একটি বাই-বাইট চরিত্রের প্রথম চরিত্রটি হারিয়ে গেছে is 10xxxxxx
পূর্ববর্তীটি ছাড়াই আপনি যত তাড়াতাড়ি দেখতে পাবেন 110xxxxxx
, আপনি নিশ্চিত করতে পারেন যে কোনও বাইট হারিয়ে গেছে বা ক্ষতিগ্রস্থ হয়েছে, এবং সেই চরিত্রটি বাতিল করুন (বা এটি কোনও সার্ভার বা যা-কিছু হোক) পুনরায় অনুরোধ করুন এবং আপনি আবার কোনও বৈধ প্রথম বাইট না পাওয়া পর্যন্ত এগিয়ে যান ।
আমি মাইএসকিউএলে ইউটিএফ -8 এবং ইউটিএফ -16 এর মধ্যে ডাটাবেস কর্মক্ষমতা তুলনা করতে কিছু পরীক্ষা করেছি tests
ইউটিএফ -32-এ সমস্ত অক্ষর 32 বিট সহ কোডেড হয়। সুবিধাটি হ'ল আপনি সহজেই স্ট্রিংয়ের দৈর্ঘ্য গণনা করতে পারেন। অসুবিধাটি হ'ল প্রতিটি ASCII অক্ষরের জন্য আপনি অতিরিক্ত তিনটি বাইট নষ্ট করেন।
ইউটিএফ -8 অক্ষরের পরিবর্তনশীল দৈর্ঘ্য রয়েছে, এএসসিআইআই অক্ষরগুলি একটি বাইটে (আট বিট) কোড করা হয়েছে, বেশিরভাগ পশ্চিমা বিশেষ অক্ষর দুটি বাইট বা তিন বাইটে কোড করা হয় (উদাহরণস্বরূপ - তিনটি বাইট হয়), এবং আরও বহিরাগত অক্ষরগুলি গ্রহণ করতে পারে চার বাইট। স্পষ্ট অসুবিধাটি হ'ল, এমন একটি অগ্রাধিকার আপনি স্ট্রিংয়ের দৈর্ঘ্য গণনা করতে পারবেন না। তবে এটি ইউটিএফ -32 এর তুলনায় ল্যাটিন (ইংরেজি) বর্ণমালার কোডের কোডটি কম বাইট নেবে।
UTF-16 এছাড়াও পরিবর্তনশীল দৈর্ঘ্য। অক্ষর দুটি বাইট বা চার বাইটে কোড করা হয়। আমি সত্যিই বিন্দু দেখতে পাচ্ছি না। এটির পরিবর্তনশীল দৈর্ঘ্য হওয়ার অসুবিধা রয়েছে, তবে ইউটিএফ -8 এর মতো বেশি জায়গা সাশ্রয়ের সুবিধা পায়নি।
এই তিনটির মধ্যে স্পষ্টতই ইউটিএফ -8 সবচেয়ে বেশি ছড়িয়ে পড়ে।
আপনার বিকাশের পরিবেশের উপর নির্ভর করে আপনার অভ্যন্তরীণভাবে স্ট্রিং ডেটা টাইপটি কীভাবে এনকোডিং করা হবে তা পছন্দ করতে পারে না।
তবে ডেটা সংরক্ষণ এবং বিনিময় করার জন্য আমি আপনার পছন্দ মতো থাকলে সর্বদা ইউটিএফ -8 ব্যবহার করব। আপনার যদি বেশিরভাগ এএসসিআইআই ডেটা থাকে তবে এটি আপনাকে স্থানান্তর করতে সর্বনিম্ন পরিমাণ ডেটা দেবে, তবুও সমস্ত কিছু এনকোড করতে সক্ষম হবেন। আধুনিক মেশিনে যাওয়ার উপায় হ'ল কমপক্ষে I / O এর জন্য অনুকূলকরণ।
উল্লিখিত হিসাবে, পার্থক্যটি মূলত অন্তর্নিহিত ভেরিয়েবলের আকার, যা প্রতিটি ক্ষেত্রে আরও অক্ষর উপস্থাপনের অনুমতি পেতে বড় হয়।
তবে, ফন্ট, এনকোডিং এবং জিনিসগুলি দুষ্টুভাবে জটিল (অযথা?) তাই আরও বিশদ পূরণের জন্য একটি বড় লিঙ্ক প্রয়োজন:
http://www.cs.tut.fi/~jkorpela/chars.html#ascii
এগুলি সমস্ত কিছু বোঝার আশা করবেন না, তবে আপনি যদি পরে সমস্যা না চান তবে এটি যত তাড়াতাড়ি আপনি পারেন (বা কেবল অন্য কাউকে আপনার জন্য বাছাই করার জন্য) এটি যতটা সম্ভব শেখা উচিত।
পল।
সংক্ষেপে, ইউটিএফ -16 বা ইউটিএফ -32 ব্যবহারের একমাত্র কারণ যথাক্রমে অ-ইংরেজি এবং প্রাচীন স্ক্রিপ্টগুলি সমর্থন করা।
আমি ভাবছিলাম যে ওয়েব / প্রোগ্রামিংয়ের উদ্দেশ্যে যখন এটি স্পষ্টতই বেশি দক্ষ হবে তখন কেন কেউ ইউটিএফ -8 এনকোডিংবিহীন নির্বাচন করবেন না।
একটি সাধারণ ভুল ধারণা - প্রত্যয়যুক্ত সংখ্যাটি তার সামর্থ্যের ইঙ্গিত দেয় না। তারা সকলেই সম্পূর্ণ ইউনিকোডকে সমর্থন করে, কেবলমাত্র ইউটিএফ -8 একক বাইট দ্বারা এএসসিআইআই পরিচালনা করতে পারে, তাই সিপিইউ এবং ইন্টারনেটে আরও দক্ষ / কম দুর্নীতিগ্রস্থ।
কিছু ভাল পঠন: http://www.personal.psu.edu/ejp10/blogs/gotunicode/2007/10/ যে_আউটফ_ডো_আই_উস html এবং http://utf8everywhere.org