Saat menghadapi aliran byte, makna sebenarnya tidak dapat diketahui tanpa menentukan pengkodeannya.
Kalimat ini juga harus menjadi apa yang selalu kita ingat dalam pikiran kita ketika menghadapi masalah "karakter ke byte, byte ke karakter". Kalau tidak, masalah kacau mungkin mengikuti.
Bahkan, esensi dari masalah yang kacau adalah bahwa pengkodean dan decoding tidak menggunakan pengkodean yang sama. Jika Anda memahami prinsip ini, mudah untuk menyelesaikan masalah yang kacau.
Biasa digunakan dalam java adalah sebagai berikut:
1. Kelas string menggunakan string konstruktor (byte [] byte) byte []. Kelas String memberikan dua kelebihan beban pada saat yang sama (1) string (byte [] byte, charset charset)
(2) String (byte [] byte, string charsetName) digunakan untuk menentukan pengkodean.
2. Byte fungsi getBytes [] getBytes () dari kelas string juga memiliki dua kelebihan:
(1) byte [] getBytes (charset charset)
(2) byte [] getBytes (string charsetname)
Semua yang tidak memerlukan pengkodean yang ditentukan diperoleh dengan menggunakan charset default platform, yang dapat diperoleh dengan menggunakan System.getProperty ("File.encoding"), charset.defaultCharset ().
3. Printstream's Print (String S) juga dirancang untuk masalah ini. Untuk alasan ini, konstruktor printStream tidak hanya printStream (file file) dan printStream (file file, string csn)
Kalau tidak, karakter string dikonversi menjadi byte sesuai dengan pengkodean karakter default platform,
DataOutputStream Construction tidak memiliki metode untuk menentukan pengkodean, tetapi menyediakan writeutf (string str)
Berikan contoh di awal untuk menggambarkan perlunya menentukan penyandian:
Jika halaman web menentukan pengkodean sebagai UTF-8, <meta http-equiv = "tipe konten" content = "text /html; charset = utf-8" />, ada formulir di halaman, dikirim ke servlet
Kemudian aliran byte yang dilewati oleh karakter yang dimasukkan oleh pengguna sedang pengkodean sesuai dengan pengkodean yang ditentukan. Misalnya, jika Anda memasukkan "halo halo", jika UTF-8, maka yang dikirimkan adalah sebagai berikut:
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]
, Kita melihat bahwa masing-masing karakter Cina berikut menggunakan 3 byte, yang dapat digunakan untuk merujuk pada pengetahuan yang relevan dari UTF-8.
Tetapi jika halaman Anda menentukan GBK, maka transmisinya akan berbeda:
[104, 101, 108, 108, 111, -60, -29, -70, -61]
Oleh karena itu, saat menggunakan request.getParameter di sisi servlet, itu harus disebut secara internal
String s = string baru (bytes, response.getEncoding ()). Jika respons Anda tidak mengatur pengkodean, maka null encoding default akan dikonversi ke GBK untuk platform Java, dan kemudian orang Cina akan menjadi kacau.
Oleh karena itu, untuk menghindari kode yang kacau, situs JSP umumnya mengatur filter, dan semua halaman dan servet diatur untuk memiliki penyandian terpadu. response.setencoding, request.setencoding.
Di dalam Java String adalah char [], yang merupakan unit yang dikodekan dengan UTF-16 yang disimpan 16-bit. Untuk tujuan ini, saat mengubah karakter dan string menjadi byte dan mengeluarkannya ke file atau jaringan, atau membalas aliran byte yang dibaca dari file atau jaringan ke karakter dengan signifikansi praktis, Anda harus memahami apa pengkodean mereka.
Beberapa pengalaman
1. Kelas string selalu disimpan dalam pengkodean unicode.
2. Perhatikan penggunaan string.getbytes ():
Jika parameter set karakter tidak termasuk, itu akan tergantung pada pengkodean set karakter JVM. Umumnya unicode di Linux, dan GBK di bawah Windows. (Jika Anda ingin mengubah pengkodean karakter default dari JVM, gunakan opsi -dfile.encodeing = UTF -8 saat memulai JVM.
Untuk alasan keamanan, disarankan untuk selalu menelepon dengan parameter, misalnya: String S; S.Getbytes ("UTF-8").
3. Kelas Charset sangat berguna.
(1) Charset.encode sedang pengkodean, yaitu pengkodean string dalam format pengkodean set karakter yang Anda tentukan dan mengeluarkan array byte.
(2) Charset.decode adalah decoding, yaitu, decode array byte dalam format pengkodean set karakter yang Anda tentukan dan outputnya menjadi string.
Sebagai contoh:
String s = charset.defaultCharset (). DisplayName (); String s1 = "Aku menyukaimu, cintaku"; ByteBuffer bb1 = bytebuffer.wrap (s1.getbytes ("utf-8")); untuk (byte bt: bb1.array ()) {System.out.printf ("%x", bt); } // char [] usage char [] charray = {'i', 'l', 'o', 'v', 'e', 'you'}; // charbuffer penggunaan charbuffer cb = charbuffer.wrap (charray); // reposisi pointer cb.flip (); String s2 = string baru (charray); // BYTEBUFFER BYTEBUFFER BB2 = charset.forname ("UTF-8"). ENCODE (CB); // Gunakan charset untuk mengkode sebagai karakter yang ditentukan set bytebuffer bb3 = charset.forname ("UTF-8"). Encode (S1); byte [] b = bb3.array (); // Gunakan charset untuk mendekode sebagai string sesuai dengan karakter yang ditentukan set bytebuffer bb4 = byteBuffer.wrap (b); String s2 = charset.forname ("UTF-8"). Decode (BB4) .toString ();