"হাই, অ্যামিগো!"

"এখন অন্য একটি আকর্ষণীয় বিষয়ের জন্য সময় এসেছে: এনকোডিং।"

"সম্ভবত আপনি ইতিমধ্যেই কোথাও শুনেছেন যে প্রতিটি অক্ষরের একটি কোড (সংখ্যা) রয়েছে। তাই চর টাইপ প্রতীক এবং সংখ্যা উভয়কেই উপস্থাপন করতে পারে।"

"উদাহরণস্বরূপ, ইংরেজি বর্ণমালায় 'A' অক্ষরের কোড হল 65। 'B' হল 66, 'C' হল 67, ইত্যাদি। বড় হাতের অক্ষর, ছোট হাতের অক্ষর, সিরিলিক অক্ষর, চাইনিজগুলির জন্য অনন্য কোড রয়েছে অক্ষর (হ্যাঁ, প্রচুর এবং প্রচুর কোড), সংখ্যা, এবং বিভিন্ন চিহ্ন। সংক্ষেপে, আপনি একটি অক্ষর বলতে ব্যবহারিকভাবে সবকিছুর জন্য একটি কোড আছে।"

"তাহলে, প্রতিটি অক্ষর এবং অক্ষর কোন না কোন সংখ্যার সাথে মিলে যায়?"

"অবশ্যই।"

"একটি অক্ষরকে একটি সংখ্যায় এবং একটি সংখ্যাকে একটি অক্ষরে রূপান্তরিত করা যেতে পারে৷ জাভা সাধারণত তাদের মধ্যে পার্থক্য দেখতে পায় না:"

char c = 'A'; //The code (number) for 'A' is 65
c++; //Now c contains the number 66, which is the code for 'B'

"মজাদার."

"সুতরাং, একটি এনকোডিং হল প্রতীকগুলির একটি সেট এবং তাদের সাথে সম্পর্কিত কোডগুলির সেট৷ কিন্তু শুধুমাত্র একটি এনকোডিং উদ্ভাবিত হয়নি - বেশ কয়েকটি রয়েছে৷ এটি পরবর্তীতে একটি সাধারণ সার্বজনীন এনকোডিং, ইউনিকোড, উদ্ভাবিত হয়নি।"

"কিন্তু যতই সার্বজনীন মান উদ্ভাবন করা হোক না কেন, কেউ পুরানোগুলি পরিত্যাগ করার জন্য তাড়াহুড়ো করে না। এবং তারপরে সবকিছু এই কার্টুনের মতোই ঘটে:"

অক্ষর এনকোডিং - 1

"ভাবুন যে ভিনসেন্ট এবং নিক তাদের নিজস্ব এনকোডিং তৈরি করার সিদ্ধান্ত নিয়েছে।"

"এখানে ভিনসেন্টের এনকোডিং:"
অক্ষর এনকোডিং - 2

"এবং এখানে নিকের এনকোডিং:"
অক্ষর এনকোডিং - 3

"তারা এমনকি একই অক্ষর ব্যবহার করে, কিন্তু অক্ষরের কোডগুলি ভিন্ন।"

"যখন 'ABC-123' স্ট্রিংটি ভিনসেন্টের এনকোডিং ব্যবহার করে একটি ফাইলে লেখা হয়, আমরা নিম্নলিখিত বাইটের সেট পাই:"
অক্ষর এনকোডিং - 4

"এবং এখন অন্য একটি প্রোগ্রাম যা নিক এর এনকোডিং ব্যবহার করে ফাইলটি পড়তে চায়:"

"এটি যা পড়বে তা এখানে: «345-IJK»।"

"এবং সবচেয়ে খারাপ জিনিস হল যে এনকোডিংগুলি সাধারণত ফাইলগুলিতে কোথাও সংরক্ষণ করা হয় না, তাই বিকাশকারীদের অনুমান করতে হবে।"

"আচ্ছা, তারা কিভাবে তাদের অনুমান করবেন?"

"এটি একটি ভিন্ন বিষয়। কিন্তু আমি ব্যাখ্যা করতে চাই কিভাবে এনকোডিং এর সাথে কাজ করতে হয়। আপনি ইতিমধ্যেই জানেন, জাভাতে একটি অক্ষরের আকার দুই বাইট। এবং জাভা স্ট্রিং ইউনিকোড বিন্যাস ব্যবহার করে।"

"কিন্তু জাভা আপনাকে একটি স্ট্রিংকে যে কোনো এনকোডিংয়ে বাইটের সেটে রূপান্তর করতে দেয় যা এটি জানে। স্ট্রিং ক্লাসে এর জন্য বিশেষ পদ্ধতি রয়েছে। জাভাতে একটি বিশেষ বর্ণসেট ক্লাস রয়েছে যা একটি নির্দিষ্ট এনকোডিং বর্ণনা করে।"

1) আমি কীভাবে জাভা সমর্থন করে এমন সমস্ত এনকোডিংয়ের একটি তালিকা পেতে পারি?

"এটির জন্য উপলব্ধচ্যারসেট নামে একটি বিশেষ স্ট্যাটিক পদ্ধতি রয়েছে৷ "এই পদ্ধতিটি জোড়ার একটি সেট প্রদান করে (এনকোডিং নাম, বস্তু যা এনকোডিং বর্ণনা করে):"

SortedMap<String,Charset> charsets = Charset.availableCharsets();

"প্রতিটি এনকোডিংয়ের একটি অনন্য নাম রয়েছে৷ এখানে তাদের কয়েকটি রয়েছে: UTF-8, UTF-16, Windows-1251, KOI8-R,…"

2) আমি কিভাবে বর্তমান সক্রিয় এনকোডিং (ইউনিকোড) পেতে পারি?

" এর জন্য ডিফল্টচার্সেট নামে একটি বিশেষ পদ্ধতি রয়েছে ৷

Charset currentCharset = Charset.defaultCharset();

3) আমি কীভাবে একটি স্ট্রিংকে একটি নির্দিষ্ট এনকোডিংয়ে রূপান্তর করব?

"জাভাতে, আপনি জাভা জানেন এমন যেকোন এনকোডিংয়ে আপনি একটি স্ট্রিংকে একটি বাইট অ্যারেতে রূপান্তর করতে পারেন:"

পদ্ধতি উদাহরণ
byte[] getBytes()
String s = "Good news, everyone!";
byte[] buffer = s.getBytes()
byte[] getBytes(Charset charset)
String s = "Good news, everyone!";
Charset koi8 = Charset.forName("KOI8-R");
byte[] buffer = s.getBytes(koi8);
byte[] getBytes(String charsetName)
String s = "Good news, everyone!";
byte[] buffer = s.getBytes("Windows-1251")

4) আমি কীভাবে একটি বাইট অ্যারে রূপান্তর করব যা আমি একটি ফাইল থেকে একটি স্ট্রিংয়ে পড়ি, যদি আমি জানি যে ফাইলটির এনকোডিং কী ছিল?

"এটি আরও সহজ৷ স্ট্রিং ক্লাসের একটি বিশেষ কনস্ট্রাক্টর রয়েছে:"

পদ্ধতি উদাহরণ
String(byte bytes[])
byte[] buffer = new byte[1000];
inputStream.read(buffer);

String s = new String(buffer);
String(byte bytes[], Charset charset)
byte[] buffer = new byte[1000];
inputStream.read(buffer);

Charset koi8 = Charset.forName("KOI8-R");
String s = new String(buffer, koi8);
String(byte bytes[], String charsetName)
byte[] buffer = new byte[1000];
inputStream.read(buffer);

String s = new String(buffer, "Windows-1251");

5) আমি কীভাবে একটি বাইট অ্যারেকে এক এনকোডিং থেকে অন্যটিতে রূপান্তর করব?

"অনেক উপায় আছে। এখানে সবচেয়ে সহজ একটি হল:"

Charset koi8 = Charset.forName("KOI8-R");
Charset windows1251 = Charset.forName("Windows-1251");

byte[] buffer = new byte[1000];
inputStream.read(buffer);
String s = new String(buffer, koi8);
buffer = s.getBytes(windows1251);
outputStream.write(buffer);

"আমি যা ভেবেছিলাম তাই। আকর্ষণীয় পাঠের জন্য ধন্যবাদ, ঋষি।"