"Hai, Amigo!"

"Sekarang saatnya untuk topik menarik lainnya: penyandian."

"Mungkin Anda pernah mendengar di suatu tempat bahwa setiap karakter memiliki kode (angka). Itu sebabnya tipe karakter dapat mewakili simbol dan angka."

“Misalnya kode huruf ‘A’ pada abjad Inggris adalah 65. ‘B’ adalah 66, ‘C’ adalah 67, dan seterusnya. Ada kode unik untuk huruf besar, huruf kecil, huruf Cyrillic, huruf Cina karakter (ya, banyak sekali kode), angka, dan berbagai simbol. Singkatnya, ada kode untuk hampir semua hal yang Anda sebut karakter."

"Jadi, setiap huruf dan karakter berhubungan dengan angka tertentu?"

"Dengan tepat."

"Karakter dapat diubah menjadi angka, dan angka menjadi karakter. Java umumnya tidak melihat perbedaan di antara keduanya:"

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, pengkodean adalah sekumpulan simbol dan kumpulan kode yang sesuai. Tetapi tidak hanya satu pengkodean yang ditemukan—ada beberapa. Baru kemudian pengkodean universal yang umum, Unicode, ditemukan."

"Tapi tidak peduli berapa banyak standar universal yang ditemukan, tidak ada yang terburu-buru untuk meninggalkan yang lama. Dan kemudian semuanya terjadi seperti di kartun ini:"

Pengkodean karakter - 1

"Bayangkan Vincent dan Nick memutuskan untuk membuat penyandian sendiri."

"Ini penyandian Vincent:"
Pengkodean karakter - 2

"Dan inilah penyandian Nick:"
Pengkodean karakter - 3

"Mereka bahkan menggunakan karakter yang sama, tetapi kode untuk karakternya berbeda."

"Ketika string 'ABC-123' ditulis ke file menggunakan pengkodean Vincent, kami mendapatkan kumpulan byte berikut:"
Pengkodean karakter - 4

"Dan sekarang program lain yang menggunakan penyandian Nick ingin membaca file tersebut:"

"Ini yang akan terbaca: «345-IJK»."

"Dan yang terburuk adalah pengkodean biasanya tidak disimpan di mana pun dalam file, jadi pengembang harus menebak."

"Yah, bagaimana mereka menebaknya?"

"Itu topik yang berbeda. Tapi saya ingin menjelaskan cara bekerja dengan pengkodean. Seperti yang sudah Anda ketahui, ukuran char di Java adalah dua byte. Dan Java Strings menggunakan format Unicode."

"Tapi Java memungkinkan Anda mengonversi sebuah String menjadi satu set byte dalam pengkodean apa pun yang diketahuinya. Kelas String memiliki metode khusus untuk ini. Java juga memiliki kelas Charset khusus yang menjelaskan pengkodean tertentu."

1) Bagaimana cara mendapatkan daftar semua pengkodean yang didukung Java?

"Ada metode statis khusus yang disebut availableCharsets untuk itu. "Metode ini mengembalikan sekumpulan pasangan (nama penyandian, objek yang menjelaskan penyandian):"

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

"Setiap penyandian memiliki nama yang unik. Berikut adalah beberapa di antaranya: UTF-8, UTF-16, Windows-1251, KOI8-R,…"

2) Bagaimana cara mendapatkan pengkodean aktif saat ini (Unicode)?

"Ada metode khusus yang disebut defaultCharset untuk itu.

Charset currentCharset = Charset.defaultCharset();

3) Bagaimana cara mengonversi String ke pengkodean tertentu?

"Di Java, Anda dapat mengonversi String menjadi array byte dalam pengkodean apa pun yang diketahui Java:"

metode 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) Bagaimana cara mengonversi array byte yang saya baca dari file ke String, jika saya tahu apa pengkodeannya di dalam file?

"Ini bahkan lebih mudah. ​​Kelas String memiliki konstruktor khusus:"

metode 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) Bagaimana cara mengonversi array byte dari satu pengkodean ke pengkodean lainnya?

"Ada banyak cara. Ini salah satu yang paling sederhana:"

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 kupikirkan. Terima kasih atas pelajaran menariknya, Rishi."