Artikel berikut akan menjelaskan dan membahas masalah di atas. Kami akan mengambil kata "Cina" sebagai contoh. Pencarian informasi yang relevan menunjukkan bahwa pengkodean GB2312 untuk "Cina" adalah "d6d0 cec4" dan pengkodean Unicode adalah "4e2d 6587", pengkodean UTF adalah "e4b8ad e69687". (Perhatikan bahwa dua kata "Cina" tidak memiliki pengkodean iso8859-1, tetapi dapat "diwakili" dengan pengkodean iso8859-1).
1. Pengetahuan dasar coding:
Pengkodean paling awal adalah iso8859-1, yang mirip dengan pengkodean ascii. Namun, untuk memfasilitasi representasi berbagai bahasa, banyak pengkodean standar yang muncul secara bertahap. Yang penting adalah sebagai berikut:
1.iso8859-1
Ini adalah pengkodean byte tunggal, dan rentang karakter maksimum yang dapat diwakili adalah 0-255. Ini diterapkan pada seri bahasa Inggris. Misalnya pengkodean huruf a adalah 0x61=97.
Jelas sekali, rentang karakter yang diwakili oleh pengkodean iso8859-1 sangat sempit dan tidak dapat mewakili karakter Cina. Namun, karena ini adalah pengkodean byte tunggal dan konsisten dengan unit representasi paling dasar komputer, pengkodean iso8859-1 masih digunakan dalam banyak kasus. Dan pada banyak protokol, pengkodean ini digunakan secara default. Misalnya, meskipun kata "China" tidak ada dalam pengkodean iso8859-1, dengan mengambil contoh pengkodean gb2312, kata tersebut harus berupa dua karakter "d6d0 cec4". Saat menggunakan pengkodean iso8859-1, kata tersebut akan dibagi menjadi 4 byte . Mewakili: "d6 d0 ce c4" (sebenarnya, saat menyimpan, itu juga diproses dalam byte). Dan jika pengkodean UTF, itu adalah 6 byte "e4 b8 ad e6 96 87". Jelasnya, representasi ini perlu didasarkan pada pengkodean lain.
2.GB2312/GBK
Ini adalah kode standar nasional Hanzi, yang khusus digunakan untuk mewakili karakter Cina. Ini adalah pengkodean byte ganda, dan huruf bahasa Inggris konsisten dengan iso8859-1 (kompatibel dengan pengkodean iso8859-1). Diantaranya, pengkodean gbk dapat digunakan untuk mewakili karakter Cina tradisional dan karakter yang disederhanakan secara bersamaan, sedangkan gb2312 hanya dapat mewakili karakter yang disederhanakan.
3.unikode
Ini adalah pengkodean paling terpadu yang dapat digunakan untuk merepresentasikan karakter dalam semua bahasa, dan merupakan pengkodean byte ganda (juga empat byte) dengan panjang tetap, termasuk huruf bahasa Inggris. Jadi dapat dikatakan tidak kompatibel dengan pengkodean iso8859-1, juga tidak kompatibel dengan pengkodean apa pun. Namun dibandingkan dengan pengkodean iso8859-1, pengkodean uniocode hanya menambahkan 0 byte di depannya, misalnya huruf a adalah "00 61".
Perlu dicatat bahwa pengkodean dengan panjang tetap mudah untuk diproses oleh komputer (perhatikan bahwa GB2312/GBK bukanlah pengkodean dengan panjang tetap), dan unicode dapat digunakan untuk mewakili semua karakter, sehingga pengkodean unicode digunakan secara internal di banyak perangkat lunak, seperti jawa.
4.UTF
Mengingat pengkodean unicode tidak kompatibel dengan pengkodean iso8859-1, dan mudah memakan lebih banyak ruang: karena untuk huruf bahasa Inggris, unicode juga memerlukan dua byte untuk mewakilinya. Jadi unicode tidak nyaman untuk transmisi dan penyimpanan. Oleh karena itu, pengkodean UTF diproduksi. Pengkodean UTF kompatibel dengan pengkodean ISO8859-1 dan juga dapat digunakan untuk mewakili karakter dalam semua bahasa. Namun, pengkodean UTF adalah pengkodean dengan panjang variabel, dan panjang setiap karakter berkisar antara 1-6 byte. Selain itu, pengkodean UTF hadir dengan fungsi verifikasi sederhana. Secara umum, huruf bahasa Inggris diwakili oleh satu byte, sedangkan karakter Cina menggunakan tiga byte.
Perhatikan bahwa meskipun UTF digunakan menggunakan lebih sedikit ruang, ini hanya dibandingkan dengan pengkodean Unicode. Jika Anda sudah tahu bahwa itu adalah karakter Cina, tidak diragukan lagi menggunakan GB2312/GBK adalah yang paling ekonomis. Namun di sisi lain, perlu dicatat bahwa meskipun pengkodean UTF menggunakan 3 byte untuk karakter Cina, bahkan untuk halaman web karakter Cina, pengkodean UTF akan menghemat lebih banyak daripada pengkodean Unicode, karena halaman web berisi banyak karakter bahasa Inggris.
2. Pemrosesan karakter di Java
Saat menulis aplikasi Java, akan ada banyak tempat yang melibatkan pengkodean kumpulan karakter. Beberapa tempat memerlukan pengaturan yang benar, dan beberapa tempat memerlukan tingkat pemrosesan tertentu.
1.getBytes(rangkaian karakter)
Ini adalah fungsi standar untuk pemrosesan string Java. Fungsinya untuk mengkodekan karakter yang diwakili oleh string sesuai dengan rangkaian karakter dan merepresentasikannya dalam byte. Perhatikan bahwa string selalu disimpan dalam memori Java dalam pengkodean unicode. Misalnya, "Cina" disimpan sebagai "4e2d 6587" dalam keadaan normal (yaitu, ketika tidak ada kesalahan). Jika rangkaian karakternya adalah "gbk", maka dikodekan sebagai "d6d0 cec4", dan kemudian byte "d6 d0 ce c4" dikembalikan. Jika rangkaian karakternya adalah "utf8", akhirannya adalah "e4 b8 ad e6 96 87". Jika "iso8859-1", karena tidak dapat dikodekan, "3f 3f" akhirnya dikembalikan (Catatan: "3f 3f" adalah dua tanda tanya).
2. String baru (rangkaian karakter)
Ini adalah fungsi standar lain untuk pemrosesan string Java. Ini adalah kebalikan dari fungsi sebelumnya. Ini menggabungkan dan mengidentifikasi array byte sesuai dengan pengkodean charset, dan akhirnya mengubahnya menjadi unicode untuk penyimpanan. Mengacu pada contoh getBytes di atas, baik "gbk" dan "utf8" dapat memberikan hasil yang benar "4e2d 6587", tetapi iso8859-1 akhirnya menjadi "003f 003f" (dua tanda tanya).
Karena utf8 dapat digunakan untuk mewakili/mengkodekan semua karakter, String baru( str.getBytes( "utf8" ), "utf8" ) === str, yang sepenuhnya dapat dibalik.
3. setKarakterEncoding()
Fungsi ini digunakan untuk mengatur permintaan http atau pengkodean yang sesuai.
Untuk permintaan, ini mengacu pada pengkodean konten yang dikirimkan. Setelah menentukan, Anda bisa langsung mendapatkan string yang benar melalui getParameter(). Jika tidak ditentukan, pengkodean iso8859-1 digunakan secara default, yang memerlukan pemrosesan lebih lanjut. Lihat "Input formulir" di bawah. Perlu dicatat bahwa getParameter() tidak dapat dieksekusi sebelum setCharacterEncoding() dijalankan. Dokumen java menyatakan: Metode ini harus dipanggil sebelum membaca parameter permintaan atau membaca input menggunakan getReader().