"हाय, अमिगो!"

"आता दुसर्या मनोरंजक विषयाची वेळ आली आहे: एन्कोडिंग्स."

"कदाचित तुम्ही आधीच कुठेतरी ऐकले असेल की प्रत्येक अक्षराला एक कोड (संख्या) आहे. म्हणूनच वर्ण प्रकार चिन्ह आणि संख्या दोन्ही दर्शवू शकतो."

"उदाहरणार्थ, इंग्रजी वर्णमालेतील 'A' अक्षरासाठी कोड 65 आहे. 'B' 66 आहे, 'C' 67 आहे, आणि असेच. अप्परकेस अक्षरे, लोअरकेस अक्षरे, सिरिलिक अक्षरे, चिनी अक्षरांसाठी अद्वितीय कोड आहेत वर्ण (होय, बरेच आणि बरेच कोड), संख्या आणि विविध चिन्हे. थोडक्यात, आपण अक्षर म्हणू इच्छित असलेल्या व्यावहारिक प्रत्येक गोष्टीसाठी एक कोड आहे."

"म्हणजे, प्रत्येक अक्षर आणि वर्ण काही संख्येशी संबंधित आहेत?"

"नक्की."

"एखाद्या अक्षराचे एका संख्येत रूपांतर केले जाऊ शकते आणि संख्या एका वर्णात बदलली जाऊ शकते. Java ला सामान्यतः त्यांच्यात फरक दिसत नाही:"

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

"रंजक."

"म्हणून, एन्कोडिंग हा चिन्हांचा आणि त्यांच्याशी संबंधित कोडचा संच आहे. परंतु केवळ एका एन्कोडिंगचा शोध लावला गेला नाही - बरेच काही आहेत. नंतरच्या काळात एक सामान्य सार्वत्रिक एन्कोडिंग, युनिकोडचा शोध लागला नाही."

"परंतु कितीही सार्वत्रिक मानकांचा शोध लावला गेला तरी, जुन्याचा त्याग करण्याची कोणालाही घाई नाही. आणि मग सर्वकाही या व्यंगचित्राप्रमाणेच घडते:"

कॅरेक्टर एन्कोडिंग - १

"कल्पना करा की व्हिन्सेंट आणि निक त्यांचे स्वतःचे एन्कोडिंग बनवण्याचा निर्णय घेतात."

"हे व्हिन्सेंटचे एन्कोडिंग आहे:"
वर्ण एन्कोडिंग - 2

"आणि येथे निकचे एन्कोडिंग आहे:"
वर्ण एन्कोडिंग - 3

"ते समान वर्ण देखील वापरतात, परंतु वर्णांचे कोड वेगळे आहेत."

"जेव्हा 'ABC-123' ही स्ट्रिंग व्हिन्सेंटचे एन्कोडिंग वापरून फाइलवर लिहिली जाते, तेव्हा आम्हाला बाइट्सचा खालील संच मिळतो:"
वर्ण एन्कोडिंग - 4

"आणि आता निकचे एन्कोडिंग वापरणारा दुसरा प्रोग्राम फाइल वाचू इच्छितो:"

"ते काय वाचेल ते येथे आहे: «345-IJK»."

"आणि सर्वात वाईट गोष्ट म्हणजे एन्कोडिंग सामान्यत: फाइल्समध्ये कुठेही संग्रहित केली जात नाहीत, त्यामुळे विकसकांना अंदाज लावावा लागतो."

"बरं, त्यांना त्यांचा अंदाज कसा आहे?"

"तो एक वेगळा विषय आहे. पण मला एन्कोडिंगसह कसे कार्य करायचे ते समजावून सांगायचे आहे. तुम्हाला आधीच माहित आहे की, Java मधील वर्णाचा आकार दोन बाइट्स असतो. आणि Java Strings युनिकोड फॉरमॅट वापरतात."

"परंतु Java तुम्हाला स्ट्रिंगला माहित असलेल्या कोणत्याही एन्कोडिंगमधील बाइट्सच्या संचामध्ये रूपांतरित करू देतो. स्ट्रिंग क्लासमध्ये यासाठी विशेष पद्धती आहेत. Java मध्ये एक विशेष वर्णसेट वर्ग देखील आहे जो विशिष्ट एन्कोडिंगचे वर्णन करतो."

१) Java सपोर्ट करत असलेल्या सर्व एन्कोडिंगची यादी मला कशी मिळेल?

"त्यासाठी उपलब्ध चारसेट्स नावाची एक विशेष स्थिर पद्धत आहे. "ही पद्धत जोड्यांचा संच (एनकोडिंग नाव, एन्कोडिंगचे वर्णन करणारी ऑब्जेक्ट) परत करते:"

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

"प्रत्येक एन्कोडिंगचे एक वेगळे नाव आहे. येथे त्यापैकी काही आहेत: UTF-8, UTF-16, Windows-1251, KOI8-R,…"

२) मला सध्याचे सक्रिय एन्कोडिंग (युनिकोड) कसे मिळेल?

" त्यासाठी defaultCharset नावाची एक विशेष पद्धत आहे .

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");

५) मी बाइट अॅरेला एका एन्कोडिंगमधून दुसऱ्या एन्कोडिंगमध्ये कसे रूपांतरित करू?

"अनेक मार्ग आहेत. येथे सर्वात सोपा आहे:"

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);

"मला तेच वाटलं. मनोरंजक धड्याबद्दल धन्यवाद, ऋषी."