"Hai, Amigo!"

"Kini tiba masanya untuk topik menarik lain: pengekodan."

"Mungkin anda pernah mendengar di suatu tempat bahawa setiap aksara mempunyai kod (nombor). Itulah sebabnya jenis aksara boleh mewakili kedua-dua simbol dan nombor."

"Sebagai contoh, kod untuk huruf 'A' dalam abjad Inggeris ialah 65. 'B' ialah 66, 'C' ialah 67, dan seterusnya. Terdapat kod unik untuk huruf besar, huruf kecil, huruf Cyrillic, Cina aksara (ya, banyak dan banyak kod), nombor dan pelbagai simbol. Ringkasnya, terdapat kod untuk hampir semua yang anda panggil watak."

"Jadi, setiap huruf dan aksara sepadan dengan beberapa nombor?"

"Tepat sekali."

"Aksara boleh ditukar kepada nombor dan nombor kepada aksara. Java secara amnya tidak melihat perbezaan antara mereka:"

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

"Menarik."

"Jadi, pengekodan ialah satu set simbol dan set kod yang sepadan dengannya. Tetapi bukan hanya satu pengekodan telah dicipta—terdapat agak sedikit. Hanya kemudiannya pengekodan sejagat biasa, Unicode, dicipta."

"Tetapi tidak kira berapa banyak piawaian sejagat yang dicipta, tiada siapa yang tergesa-gesa untuk meninggalkan yang lama. Dan kemudian semuanya berlaku seperti dalam kartun ini:"

Pengekodan aksara - 1

"Bayangkan Vincent dan Nick memutuskan untuk membuat pengekodan mereka sendiri."

"Ini pengekodan Vincent:"
Pengekodan aksara - 2

"Dan inilah pengekodan Nick:"
Pengekodan aksara - 3

"Mereka juga menggunakan aksara yang sama, tetapi kod untuk watak itu berbeza."

"Apabila rentetan 'ABC-123' ditulis pada fail menggunakan pengekodan Vincent, kami mendapat set bait berikut:"
Pengekodan aksara - 4

"Dan kini satu lagi program yang menggunakan pengekodan Nick mahu membaca fail:"

"Inilah yang akan dibaca: «345-IJK»."

"Dan perkara yang paling teruk ialah pengekodan biasanya tidak disimpan di mana-mana dalam fail, jadi pembangun perlu meneka."

"Nah, bagaimana mereka meneka mereka?"

"Itu topik yang berbeza. Tetapi saya ingin menerangkan cara bekerja dengan pengekodan. Seperti yang anda sedia maklum, saiz aksara dalam Java ialah dua bait. Dan Java Strings menggunakan format Unicode."

"Tetapi Java membenarkan anda menukar String kepada set bait dalam sebarang pengekodan yang diketahuinya. Kelas String mempunyai kaedah khas untuk ini. Java juga mempunyai kelas Charset khas yang menerangkan pengekodan tertentu."

1) Bagaimanakah cara saya mendapatkan senarai semua pengekodan yang disokong Java?

"Terdapat kaedah statik khas yang dipanggil availableCharsets untuk itu. "Kaedah ini mengembalikan set pasangan (nama pengekodan, objek yang menerangkan pengekodan):"

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

"Setiap pengekodan mempunyai nama yang unik. Berikut ialah beberapa daripadanya: UTF-8, UTF-16, Windows-1251, KOI8-R,…"

2) Bagaimanakah cara saya mendapatkan pengekodan aktif semasa (Unicode)?

"Terdapat kaedah khas yang dipanggil defaultCharset untuk itu.

Charset currentCharset = Charset.defaultCharset();

3) Bagaimanakah cara saya menukar String kepada pengekodan tertentu?

"Di Java, anda boleh menukar String kepada tatasusunan bait dalam mana-mana pengekodan yang Java tahu:"

Kaedah Contoh
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) Bagaimanakah cara untuk menukar tatasusunan bait yang saya baca daripada fail kepada String, jika saya tahu pengekodannya dalam fail?

"Ini lebih mudah lagi. Kelas String mempunyai pembina khas:"

Kaedah Contoh
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) Bagaimanakah cara menukar tatasusunan bait daripada satu pengekodan kepada pengekodan yang lain?

"Terdapat banyak cara. Ini antara yang paling mudah:"

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

"Itu yang saya fikirkan. Terima kasih atas pengajaran yang menarik, Rishi."