ইউটিএফ -8 এবং ইউটিএফ -16 এর মধ্যে পার্থক্য?


137

ইউটিএফ -8 এবং ইউটিএফ -16 এর মধ্যে পার্থক্য? আমাদের এগুলি কেন দরকার?

MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";

md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();

উত্তর:


284

আমি বিশ্বাস করি ওয়েব সম্পর্কে এই সম্পর্কে প্রচুর ভাল নিবন্ধ রয়েছে তবে এখানে একটি সংক্ষিপ্তসার দেওয়া হল।

ইউটিএফ -8 এবং ইউটিএফ -16 উভয়ই পরিবর্তনশীল দৈর্ঘ্যের এনকোডিং। তবে, ইউটিএফ -8 এ একটি অক্ষর সর্বনিম্ন 8 বিট দখল করতে পারে, যখন ইউটিএফ -16 অক্ষরের দৈর্ঘ্য 16 বিট দিয়ে শুরু হয়।

প্রধান ইউটিএফ -8 পেশাদার:

  • বুনিয়াদি ASCII অক্ষর যেমন অঙ্ক, ল্যাটিন অক্ষরবিহীন অক্ষর ইত্যাদির একটি বাইট দখল করে যা US-ASCII প্রতিনিধির অনুরূপ। এইভাবে সমস্ত ইউএস-এএসসিআইআই স্ট্রিংগুলি বৈধ ইউটিএফ -8 হয়ে যায়, যা অনেক ক্ষেত্রে শালীন পিছনের দিকে সামঞ্জস্যতা সরবরাহ করে।
  • কোনও নাল বাইট নেই, যা নাল-টার্মিনেটেড স্ট্রিংগুলি ব্যবহার করতে দেয়, এটি পিছনের সামঞ্জস্যের খুব বড় অংশের পরিচয় দেয়।
  • ইউটিএফ -8 বাইট অর্ডার থেকে স্বতন্ত্র, সুতরাং আপনাকে বিগ এন্ডিয়ান / লিটল এন্ডিয়ান ইস্যু সম্পর্কে চিন্তা করতে হবে না।

প্রধান ইউটিএফ -8 কনস:

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

প্রধান ইউটিএফ -16 পেশাদার:

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

প্রধান ইউটিএফ -16 কনস:

  • ইউএস-এএসসিআইআই স্ট্রিংগুলিতে প্রচুর নাল বাইট, যার অর্থ নাল-টার্মিনেটেড স্ট্রিং এবং প্রচুর অপচয় হওয়া স্মৃতি নেই।
  • এটিকে অনেকগুলি সাধারণ পরিস্থিতিতে (বিশেষত মার্কিন যুক্তরাষ্ট্র / ইইউ / সিরিলিক বর্ণমালা / ইস্রায়েল / আরব দেশসমূহ / ইরান এবং আরও অনেক দেশগুলিতে) একটি নির্দিষ্ট দৈর্ঘ্যের এনকোডিং হিসাবে "বেশিরভাগই কাজ করে" হিসাবে ব্যবহার করা হয়, যেখানে প্রায়শই এটি ভাঙ্গা সমর্থন জোগায়। এর অর্থ প্রোগ্রামারদের সার্গেট জোড় সম্পর্কে সচেতন হতে হবে এবং এটি যে ক্ষেত্রে গুরুত্বপূর্ণ তা সঠিকভাবে পরিচালনা করতে হবে!
  • এটি ভেরিয়েবলের দৈর্ঘ্য, সুতরাং ইউটিএফ -8 এর চেয়ে কম হলেও কোডিং পয়েন্টগুলি গণনা বা সূচীকরণ ব্যয়বহুল।

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


3
ইউটিএফ 16 এ কেবল বিই / লে অংশ অনুপস্থিত :) ইউটিএফ -8 এর আরও একটি খারাপ দিক রয়েছে, এটি ইউটিএফ 16 এর চেয়ে দীর্ঘ আউটপুট উত্পন্ন করতে পারে
শে

4
হ্যাঁ, আমি BE / LE সম্পর্কে ভুলে গেছি। বিশেষত মেমরির ব্যবহারের জন্য এটি কোনও বড় বিষয় নয়। ইউটিএফ -8 কেবলমাত্র তিন-বাইট অক্ষরের সাথে জড়িত থাকলে দীর্ঘতর আউটপুট উত্পন্ন করবে তবে এর অর্থ বেশিরভাগ চীনা এবং জাপানি। অন্যদিকে, যদি পাঠ্যে অনেকগুলি মার্কিন-এএসসিআইআই অক্ষর থাকে তবে এটি সংক্ষিপ্ত আউটপুট উত্পন্ন করতে পারে, সুতরাং এটি কোনও ক্ষতির দিক বা না কোনও নির্দিষ্ট পরিস্থিতির উপর নির্ভর করে।
সের্গেই তাচেনভ

আমি এমনকি অবধি -8, সংক্ষিপ্ত দৈর্ঘ্যের তাত্ক্ষণিক প্রো উল্লেখ করার কথা ভাবিও নি। Utf-8 এর দীর্ঘতর আউটপুট সম্পর্কে কোনও কারণে এটি 'মে' হতে পারে, তবুও লক্ষ্যটি যদি পূর্বদিকে হয় তবে ডিফল্ট এনকোডিংটি utf-16 হওয়া উচিত। উদাহরণ হিসাবে md.update (টেক্সট.জেটবাইটস ("ইউটিএফ -8")); হ্যাশ উভয় উপায়ে স্থিতিশীল হওয়ায় এনকোডিংয়ের বিষয়টি বিবেচনা করে না।
বেটসেস


আপনি বলছেন যে ইউটিএফ -8 এ অক্ষরগুলির দৈর্ঘ্য আলাদা থাকে তাই এটি সূচীকরণ এবং গণনা দৈর্ঘ্যকে ধীর করে দেয় তবে আমি ইউটিএফ -16 এর অক্ষরগুলির সম্পর্কেও ভিন্ন দৈর্ঘ্য আছে, ইউটিএফ -16 এর সূচীকরণ এবং গণনা দৈর্ঘ্যটি আরও দ্রুত হওয়া উচিত?
নিকি_জেএস

19

তারা ইউনিকোড অক্ষর উপস্থাপনের জন্য কেবল বিভিন্ন স্কিম।

উভয় পরিবর্তনশীল দৈর্ঘ্য - ইউটিএফ -16 বেসিক বহুভাষিক বিমান (বিএমপি) এর সমস্ত অক্ষরের জন্য 2 বাইট ব্যবহার করে যা সাধারণ ব্যবহারে বেশিরভাগ অক্ষর ধারণ করে।

ইউটিএফ -8 বিএমপিতে অক্ষরের জন্য 1 থেকে 3 বাইট এবং বর্তমান ইউনিকোডের U +0000 থেকে U + 1FFFFF পর্যন্ত অক্ষরের জন্য 4 অবধি ব্যবহার করে এবং যদি প্রয়োজন হয় তবে U + 7FFFFFF পর্যন্ত এক্সটেনসিবল ... তবে উল্লেখযোগ্যভাবে সমস্ত ASCII অক্ষর প্রতিটি একক বাইটে উপস্থাপিত হয়।

কোনও বার্তা হজমের উদ্দেশ্যে, আপনি এগুলির মধ্যে যেটি চয়ন করেন তা বিবেচ্য হবে না, যতক্ষণ না ডাইজেস্ট পুনরায় তৈরি করার চেষ্টা করা প্রত্যেকে একই বিকল্পটি ব্যবহার করে।

ইউটিএফ -8 এবং ইউনিকোড সম্পর্কে আরও তথ্যের জন্য এই পৃষ্ঠাটি দেখুন ।

(নোট করুন যে সমস্ত জাভা অক্ষরগুলি বিএমপি-র মধ্যে ইউটিএফ -১ points কোড পয়েন্ট; ইউ + এফএফএফএফের উপরে বর্ণগুলি উপস্থাপন করতে আপনার জাভাতে সারোগেট জোড়া ব্যবহার করতে হবে))


5

সুরক্ষা: কেবল ইউটিএফ -8 ব্যবহার করুন

ইউটিএফ -8 এবং ইউটিএফ -16 এর মধ্যে পার্থক্য? আমাদের এগুলি কেন দরকার?

ইউটিএফ -16 বাস্তবায়নে কমপক্ষে দু'পক্ষের নিরাপত্তা দুর্বলতা রয়েছে । বিস্তারিত জানার জন্য উইকিপিডিয়া দেখুন ।

WHATWG এবং W3C এখন ঘোষণা করেছে যে ওয়েবে কেবলমাত্র ইউটিএফ -8 ব্যবহার করতে হবে।

এখানে বর্ণিত [সুরক্ষা] সমস্যাগুলি একচেটিয়াভাবে ইউটিএফ -8 ব্যবহার করার পরে চলে যায়, এটি এখন এমন সমস্ত কারণগুলির মধ্যে একটি যা এখন সমস্ত কিছুর জন্য বাধ্যতামূলক এনকোডিং।

অন্যান্য দলও একই কথা বলছে।

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


4

এটি ইউটিএফ -8 / 16 এর সাথে সম্পর্কিত নয় (সাধারণত, যদিও এটি ইউটিএফ 16 এ রূপান্তর করে এবং বিই / লে অংশটি ডাব্লু / একক লাইন সেট করা যায়) তবে স্ট্রিংকে বাইটে রূপান্তর করার দ্রুততম উপায় নীচে []। উদাহরণস্বরূপ: প্রদত্ত কেসটির জন্য হ্যাশ কোডটি ভাল। স্ট্রিং.জেটবাইটস (এনক) তুলনামূলকভাবে ধীর।

static byte[] toBytes(String s){
        byte[] b=new byte[s.length()*2];
        ByteBuffer.wrap(b).asCharBuffer().put(s);
        return b;
    }

-2

ইউটিএফ -8 এবং ইউটিএফ -16 পার্থক্য করার সহজ উপায় হ'ল তাদের মধ্যে সামঞ্জস্যতা চিহ্নিত করা।

প্রদত্ত চরিত্রের জন্য একই ইউনিকোড নম্বর ভাগ করা বাদে প্রত্যেকে তাদের নিজস্ব ফর্ম্যাট।

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