Rumah > Soal Jawab > teks badan
伊谢尔伦2017-04-18 10:05:23
Anda perlu memahami maksud String baharu(str.getBytes("GBK"),"UTF-8");
Pertama sekali, String dalam Java dikodkan secara dalaman dalam UTF-16LE.
str.getBytes("GBK"), memperoleh tatasusunan Byte, kandungannya adalah untuk menukar pengekodan str kepada GBK.
String(str.getBytes("GBK"),"UTF-8") baharu merawat kandungan tatasusunan Byte ini sebagai data berkod UTF-8 dan menukarkannya kepada String (UTF-16LE).
Faham? Jika ini berfungsi, maka akan ada hantu.
Pelanggan dan pelayan kedua-duanya adalah Java, jadi pengekodan String dalam Java mestilah UTF-16. Tidak terjejas oleh pengekodan sistem (Windows atau Linux).
Dalam kes ini, sebaiknya jangan hantar String terus, kerana String akan ditukar secara automatik kepada pengekodan oleh pustaka yang anda gunakan (ambil tomcat sebagai contoh, iso8859-1 lalai).
Jika anda boleh menghantar dan menerima tatasusunan Byte secara langsung , maka anda pasti boleh UTF-8 spesifikasi protokol. Data yang diterima oleh mana-mana pihak ialah String(data, "UTF-8") baharu dan data yang dihantar ialah str.getBytes("UTF-8").
Jika anda tidak boleh menukar kod klien atau ia ditulis dalam C atau bahasa lain. Jika anda pasti pelanggan menghantar data GBK. Jika pelayan anda boleh terus menerima tatasusunan Byte , String(data, "GBK") baharu boleh dihuraikan. Apabila dikembalikan, ia juga ialah tatasusunan Byte str.getBytes("GBK").
Jika anda hanya boleh menghantar dan menerima String, maka anda perlu mengkonfigurasinya dan menetapkan pengekodan yang ditukarnya. Contohnya, untuk tomcat, untuk data GET, web.xml perlu diubah suai dan item tetapan pengekodan URL perlu ditambah. Untuk data POST, , anda mesti menulis penapis untuk menukar . Jika ia adalah kelas komunikasi HTTP, ia mungkin menyediakan kaedah seperti SetEncoding.
ringa_lee2017-04-18 10:05:23
Jika anda adalah pelanggan:
Rentetan yang anda dapat daripada pelayan adalah dikodkan UTF-8 Jika anda perlu memaparkannya, mula-mula menyahkod rentetan itu kepada kod bait mengikut UTF-8, dan kemudian ikuti pengekodan GBK.
Rentetan yang anda hantar ke pelayan juga mestilah dikodkan utf-8 Anda perlu menyahkod rentetan yang dikodkan GBK anda kepada kod bait dan kemudian mengekodnya mengikut utf-8.
Sebaliknya.
Sebab mengapa anda melihat aksara bercelaru mungkin adalah masalah pengekodan terminal anda?
String gbkStr = new String(utf8Str.getBytes("utf-8"),"gbk");
String utf8Str = new String(gbkStr.getBytes("gbk"),"utf-8");
迷茫2017-04-18 10:05:23
Boleh dikodkan oleh iso8859-1 sebagai rentetan perantaraan Jika gbk ditukar terus kepada utf–8, iaitu, 2 bait ditukar kepada 3 bait. Jika terdapat bilangan ganjil aksara Cina, adakah output ralat akan dikira semasa menukar bait terakhir? , ia masih akan bercelaru.