"Hi, Amigo!"

"Ngayon ay oras na para sa isa pang kawili-wiling paksa: mga pag-encode."

"Marahil ay narinig mo na sa isang lugar na ang bawat karakter ay may code (numero). Kaya naman ang uri ng char ay maaaring kumatawan sa parehong mga simbolo at numero."

"Halimbawa, ang code para sa letrang 'A' sa English alphabet ay 65. 'B' ay 66, 'C' ay 67, at iba pa. May mga natatanging code para sa malalaking titik, maliliit na titik, Cyrillic na titik, Chinese mga character (oo, napakaraming code), numero, at iba't ibang simbolo. Sa madaling salita, mayroong code para sa halos lahat ng tatawagin mong character."

"Kaya, ang bawat titik at karakter ay tumutugma sa ilang numero?"

"Talaga."

"Ang isang character ay maaaring ma-convert sa isang numero, at isang numero sa isang character. Ang Java sa pangkalahatan ay hindi nakakakita ng pagkakaiba sa pagitan nila:"

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

"Kawili-wili."

"Kaya, ang isang encoding ay isang set ng mga simbolo at ang kanilang kaukulang hanay ng mga code. Ngunit hindi lamang isang encoding ang naimbento—mayroong medyo marami. Ito ay hindi hanggang mamaya na ang isang karaniwang unibersal na encoding, Unicode, ay naimbento."

"Ngunit gaano man karaming mga unibersal na pamantayan ang naimbento, walang nagmamadaling iwanan ang mga luma. At pagkatapos ang lahat ay nangyayari tulad ng sa cartoon na ito:"

Mga pag-encode ng character - 1

"Isipin na nagpasya sina Vincent at Nick na gumawa ng sarili nilang pag-encode."

"Narito ang pag-encode ni Vincent:"
Mga pag-encode ng character - 2

"At narito ang pag-encode ni Nick:"
Mga pag-encode ng character - 3

"Gumagamit sila ng parehong mga character, ngunit ang mga code para sa mga character ay iba."

"Kapag ang string na 'ABC-123' ay isinulat sa isang file gamit ang pag-encode ni Vincent, nakukuha namin ang sumusunod na hanay ng mga byte:"
Mga pag-encode ng character - 4

"At ngayon ang isa pang programa na gumagamit ng pag-encode ni Nick ay gustong basahin ang file:"

"Narito ang mababasa nito: «345-IJK»."

"At ang pinakamasama ay ang mga pag-encode ay karaniwang hindi nakaimbak kahit saan sa mga file, kaya kailangang hulaan ng mga developer."

"Well, paano nila nahulaan ang mga ito?"

"Ibang paksa iyon. Ngunit nais kong ipaliwanag kung paano gumana sa mga pag-encode. Tulad ng alam mo na, ang laki ng isang char sa Java ay dalawang byte. At ang Java Strings ay gumagamit ng Unicode na format."

"Ngunit hinahayaan ka ng Java na i-convert ang isang String sa isang hanay ng mga byte sa anumang pag-encode na alam nito. Ang klase ng String ay may mga espesyal na pamamaraan para dito. Ang Java ay mayroon ding espesyal na klase ng Charset na naglalarawan ng isang partikular na encoding."

1) Paano ako makakakuha ng listahan ng lahat ng mga encoding na sinusuportahan ng Java?

"May isang espesyal na static na pamamaraan na tinatawag na availableCharsets para doon. "Ang pamamaraang ito ay nagbabalik ng isang hanay ng mga pares (pangalan ng pag-encode, bagay na naglalarawan sa pag-encode):."

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

"Ang bawat pag-encode ay may natatanging pangalan. Narito ang ilan sa mga ito: UTF-8, UTF-16, Windows-1251, KOI8-R,…"

2) Paano ko makukuha ang kasalukuyang aktibong pag-encode (Unicode)?

"May isang espesyal na pamamaraan na tinatawag na defaultCharset para doon.

Charset currentCharset = Charset.defaultCharset();

3) Paano ko iko-convert ang isang String sa isang tiyak na pag-encode?

"Sa Java, maaari mong i-convert ang isang String sa isang byte array sa anumang pag-encode na alam ng Java:"

Pamamaraan Halimbawa
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) Paano ko iko-convert ang isang byte array na nabasa ko mula sa isang file patungo sa isang String, kung alam ko kung ano ang pag-encode nito sa file?

"Mas madali pa ito. Ang String class ay may espesyal na constructor:"

Pamamaraan Halimbawa
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) Paano ko iko-convert ang isang byte array mula sa isang encoding patungo sa isa pa?

"Maraming paraan. Narito ang isa sa pinakasimpleng:"

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

"Iyon ang naisip ko. Salamat sa kawili-wiling leksyon, Rishi."