====================
Karakter kacau sangat umum muncul saat mengembangkan aplikasi Java. Bagaimanapun, Unicode tidak banyak digunakan saat ini. Dalam sistem yang menggunakan gb2312 (termasuk gbk yang disederhanakan dan big5 tradisional),
ini adalah persyaratan paling dasar untuk mengimplementasikan tampilan dan bahasa Mandarin dengan benar. penyimpanan basis data.
===============
1. Pertama, pengembang harus memahami mengapa ia menemukan kode yang kacau dan jenis kode kacau apa yang ia temui (simbol yang tidak berarti, rangkaian tanda tanya, atau yang lainnya).
Pemula biasanya bingung ketika menemukan sekumpulan karakter yang berantakan. Reaksi paling langsung adalah membuka Google dan mencari "java Chinese" (string ini sering ditanyakan di mesin pencari),
lalu melihat karakter orang lain satu per satu. satu. Solusi. Tidak ada salahnya melakukan hal ini, namun sulit mencapai tujuan tersebut, karena alasan yang disebutkan di bawah ini.
Singkatnya, ada banyak alasan untuk karakter yang kacau, dan solusinya sangat berbeda. Untuk mengatasi masalah tersebut, Anda harus menganalisis "konteks" Anda sendiri terlebih dahulu.
=============
2. Secara khusus, informasi apa yang diperlukan untuk menentukan sumber kode kacau dalam proyek tersebut.
a.Sistem operasi yang digunakan oleh pengembang
b, nama dan versi wadah j2ee
c, nama database, versi (versi persisnya) dan versi driver jdbc
d. Ada source code yang kacau (misalnya berasal dari system out, atau ada di halaman jsp. Jika di jsp, deklarasi header juga sangat penting)
========== === ================
3. Bagaimana awalnya menganalisis penyebab karakter kacau.
Dengan informasi di atas, pada dasarnya Anda dapat memposting bantuan. Saya yakin jika Anda menaruhnya di forum seperti Javaworld, para ahli akan segera memberikan solusi yang efektif untuk Anda.
Tentu saja, Anda tidak bisa selalu mengandalkan bantuan postingan, tetapi Anda juga harus mencoba menyelesaikan masalahnya sendiri. Bagaimana memulainya?
a. Analisis pengkodean "kode kacau" Anda. Ini sebenarnya tidak sulit, misalnya
Sistem.keluar.println(testString);
Ada kode yang kacau di paragraf ini, jadi sebaiknya Anda menggunakan metode lengkap untuk menebak format pengkodean sebenarnya.
System.out.println(String baru(testString.getBytes(”ISO-8859-1″),,”gb2312″));
System.out.println(String baru(testString.getBytes(”UTF8″),,”gb2312″));
System.out.println(String baru(testString.getBytes(”GB2312″),,”gb2312″));
System.out.println(String baru(testString.getBytes("GBK"),,"gb2312"));
System.out.println(String baru(testString.getBytes("BIG5"),,"gb2312"));
Tunggu, kode di atas berarti menggunakan format pengkodean yang ditentukan untuk membaca "kode kacau" testString dan mengubahnya menjadi gb2312 (hanya bahasa Mandarin yang digunakan sebagai contoh di sini)
Lalu Anda lihat hasil konversi mana yang oke, itu saja. . .
b. Jika Anda bisa mendapatkan bahasa Mandarin yang benar menggunakan langkah-langkah di atas, berarti data Anda pasti ada, tetapi tidak ditampilkan dengan benar di antarmuka. Kemudian langkah kedua adalah mengoreksi bagian tampilan Anda
. Yang biasanya perlu diperiksa adalah apakah pengkodean halaman yang dipilih di jsp sudah benar.
Saya ingin menunjukkan sesuatu yang telah disalahpahami oleh banyak orang, yaitu arahan <%@ page contentType="text/html; charset=GB2312″ %> dan <META http-equiv=Content-Type
content="text /html; charset= gb2312″>Perbedaan keduanya. Biasanya ketika banyak artikel di Internet menyebutkan masalah Cina, mereka mengatakan bahwa memilih penyimpanan unicode atau gb2312 dalam database dapat diselesaikan
dengan menggunakan
arahan halaman di jsp untuk mendeklarasikan pengkodean.Namun menurut saya pernyataan ini sangat tidak bertanggung jawab, dan menyebabkan saya menghabiskan banyak waktu merasa tertekan karena kode-kode kacau yang sebenarnya tidak ada. Faktanya, peran halaman
adalah untuk menyediakan metode pengkodean bagi Java untuk "membaca" String dalam ekspresi selama proses JSP dikompilasi ke dalam HTML (agak mirip dengan peran pernyataan ketiga di atas), dan peran
dari meta terkenal Menyediakan opsi pengkodean untuk browser IE, yang digunakan untuk "menampilkan" data akhir. Tapi saya belum melihat ada yang mengingatkan saya akan hal ini. Saya selalu menggunakan page sebagai meta,
yang mengakibatkan data yang awalnya iso-8859 dibaca sebagai gb2312 oleh perintah page, jadi kacau, jadi saya menambahkan coding. fungsi konversi untuk mengkonversi semua data string. Semuanya berubah dari iso8859 menjadi gb2312 (
kenapa
saya ubah seperti ini, saya tidak banyak berpikir saat itu, karena bisa ditampilkan secara normal, jadi saya ubah seperti ini, haha , saya benar-benar tidak punya waktu untuk memecahkan masalah secara perlahan saat itu).==================== =============
4. Pengkodean apa yang lebih baik untuk database?
DB yang populer saat ini terutama mencakup sql server, mysql, Oracle, DB2, dll. Di antara mereka, mysql adalah pemimpin di antara DB gratis. Kinerja dan fungsinya relatif mudah untuk diinstal dan dikonfigurasi, dan driver
yang sesuai
juga relatif lengkap. Rasio harga/kinerjaoke. Jadi ambil mysql sebagai contoh.
Saya pribadi merekomendasikan menggunakan pengkodean default mysql untuk penyimpanan, yaitu iso-8859-1 (sesuai dengan latin-1 pada opsi mysql). Ada beberapa alasan utama. Pertama, iso-8859-1 memiliki dukungan yang baik untuk
bahasa Mandarin
. Kedua, konsisten dengan pengkodean default di Java, yang setidaknya menghilangkan kesulitan dalam mengonversi pengkodean di banyak tempat stabil dan kompatibel.Stabilitasnya juga lebih baik, karena
dukungan multi-encoding disediakan oleh produk DB tertentu, belum lagi ketidakcocokan dengan DB lain, bahkan versi yang berbeda mungkin memiliki masalah kompatibilitas.
Misalnya, pada produk sebelum mysql 4.0, banyak solusi China menggunakan bidang characterEncoding dalam koneksi untuk mengatur pengkodean, seperti gb2312 atau semacamnya. Ini tidak masalah
karena data asli dikodekan ISO8859_1, dan driver jdbc akan menggunakan yang ditentukan. di url. Kumpulan karakter digunakan untuk pengkodean, dan resultSet.getString(*) mengeluarkan
string yang disandikan. Dengan cara ini, Anda bisa langsung mendapatkan data gb2312.
Namun, peluncuran mysql 4.1 telah membawa banyak masalah bagi banyak dbadmin, karena mysql 4.1 mendukung kumpulan karakter tingkat kolom. Setiap tabel dan kolom dapat menentukan pengkodeannya
. Jika tidak ditentukan, itu akan menjadi ISO8895_1, jadi setelah jdbc mengeluarkannya data, itu akan didasarkan pada kolom. Kumpulan karakter digunakan untuk pengkodean, alih-alih menggunakan parameter global untuk mendapatkan semua data.
Hal ini juga menunjukkan dari aspek lain bahwa masalah karakter yang kacau memang rumit dan banyak alasannya. Saya hanya memberikan beberapa solusi untuk situasi aktual yang saya temui. Jika ada
kesalahan
, silakan kirim email ke [email protected] . Saya berharap dapat melihat lebih banyak artikel master daripada sekumpulan salinan palsu.
Hanya untuk Penggunaan Intern.
Ada Pertanyaan, silakan merujuk ke [email protected]
==================== ==============
Akhirnya ditemukan solusi paling sempurna untuk masalah Tiongkok. . . Terima kasih kepada penulis artikel online ini. . .
Artikel asli saya berdasarkan pengalaman saya sendiri. Meski tidak ada yang salah, akar permasalahan terakhir tidak pernah ditemukan. Setelah membaca artikel ini, saya tiba-tiba sadar, haha,
------------------------------------------------------------------------------------------------- ——————-
Karena masalah bahasa Mandarin dalam pemrograman Java adalah masalah yang lumrah, setelah membaca banyak solusi untuk masalah bahasa Mandarin Java, dikombinasikan dengan praktik pemrograman penulis, saya menemukan bahwa banyak metode yang dibahas di masa lalu tidak dapat menjelaskan dengan jelas. masalah dan menyelesaikan masalah, terutama masalah Cina ketika lintas platform.
Jadi saya memberikan artikel ini, yang mencakup analisis saya dan solusi yang disarankan untuk masalah bahasa Mandarin di kelas, kelas Servelets, JSP dan EJB yang berjalan di konsol. Saya harap Anda bisa memberi saya nasihat.
Abstrak: Artikel ini menganalisis secara mendalam proses pengkodean/penguraian file sumber Java oleh kompiler Java dan file kelas oleh JVM dalam pemrograman Java. Melalui analisis proses ini, akar penyebab masalah bahasa Mandarin dalam pemrograman Java akhirnya terungkap diberikan Metode optimal yang diusulkan untuk menyelesaikan masalah Java Cina.
1. Sumber masalah bahasa Mandarin
. Pengkodean yang didukung oleh sistem operasi asli komputer adalah pengkodean karakter byte tunggal. Oleh karena itu, semua program pemrosesan di komputer pada awalnya diproses dalam bahasa Inggris dengan pengkodean byte tunggal.
Dengan berkembangnya komputer, untuk beradaptasi dengan bahasa negara lain di dunia (termasuk tentunya karakter Cina kita), masyarakat telah mengusulkan pengkodean UNICODE, yang menggunakan pengkodean byte ganda dan kompatibel dengan karakter bahasa Inggris. dan pengkodean karakter byte ganda dari negara lain. Oleh karena itu, saat ini, sebagian besar perangkat lunak internasional menggunakan pengkodean UNICODE secara internal. Saat perangkat lunak berjalan, ia memperoleh format pengkodean yang didukung secara default oleh sistem pendukung lokal (seringkali, sistem operasi. ), dan kemudian mengubah UNICODE dalam perangkat lunak menjadi format pengkodean yang didukung oleh sistem lokal secara default. Format tersebut ditampilkan.
Ini adalah kasus untuk JDK dan JVM Java. JDK yang saya bicarakan di sini mengacu pada JDK versi internasional. Sebagian besar pemrogram kami menggunakan versi JDK yang diinternasionalkan. Semua JDK berikut mengacu pada versi JDK yang diinternasionalkan. Karakter Mandarin kami adalah bahasa pengkodean byte ganda. Untuk memungkinkan komputer memproses bahasa Mandarin, kami telah mengembangkan standar kami sendiri seperti gb2312, GBK, dan GBK2K untuk memenuhi kebutuhan pemrosesan komputer.
Oleh karena itu, untuk menyesuaikan dengan kebutuhan kami dalam memproses bahasa Mandarin, sebagian besar sistem operasi telah menyesuaikan sistem operasi Mandarin. Mereka menggunakan format pengkodean GBK dan GB2312 untuk menampilkan karakter Mandarin kami dengan benar. Misalnya: Windows Cina menggunakan pengkodean GBK untuk tampilan secara default Saat menyimpan file di Windows 2000 Cina, format pengkodean yang digunakan secara default untuk menyimpan file juga GBK. Artinya, pengkodean internal semua file yang disimpan di Windows 2000 Cina menggunakan GBK pengkodean secara default. Catatan: GBK diperluas berdasarkan GB2312.
Karena bahasa Java menggunakan pengkodean UNICODE secara internal, ketika program Java dijalankan, terdapat masalah dalam mengonversi input dan output dari pengkodean UNICODE dan format pengkodean terkait yang didukung oleh sistem operasi dan browser. Proses konversi ini memiliki serangkaian langkah. Jika ada kesalahan dalam salah satu langkah, karakter Cina yang ditampilkan akan kacau. Ini adalah masalah umum bahasa Cina Java.
Pada saat yang sama, Java adalah bahasa pemrograman lintas platform, yang berarti bahwa program yang kami tulis tidak hanya dapat berjalan di windows berbahasa Mandarin, tetapi juga di Linux berbahasa Mandarin dan sistem lainnya. kita sering melihat Seseorang mentransplantasikan program Java yang ditulis pada Windows 2000 Cina untuk dijalankan pada Linux Inggris). Operasi transplantasi ini juga akan membawa masalah bagi Tiongkok.
Selain itu, beberapa orang menggunakan sistem operasi berbahasa Inggris dan browser berbahasa Inggris seperti IE untuk menjalankan program dengan karakter berbahasa Mandarin dan menelusuri halaman web berbahasa Mandarin. Mereka sendiri tidak mendukung bahasa Mandarin dan juga akan menyebabkan masalah berbahasa Mandarin.
Hampir semua browser meneruskan parameter dalam format pengkodean UTF-8 secara default, bukan pengkodean bahasa Mandarin. Oleh karena itu, akan ada masalah juga saat meneruskan parameter bahasa Mandarin, yang mengakibatkan karakter kacau.
Singkatnya, aspek-aspek di atas adalah sumber utama masalah berbahasa Mandarin di Java. Kami menyebut masalah yang disebabkan oleh program tidak berjalan dengan benar karena alasan di atas: Masalah Java berbahasa Mandarin.
2. Proses rinci konversi pengkodean Java.
Program Java umum kami mencakup kategori berikut:
*Kelas yang berjalan langsung di konsol (termasuk kelas antarmuka visual)
*Kelas kode JSP (Catatan: JSP adalah varian dari kelas Servlets)
*Servelets class
* Kelas EJB
* kelas pendukung lainnya yang tidak dapat dijalankan secara langsung.
File kelas ini mungkin berisi string berbahasa Mandarin, dan kita sering menggunakan tiga jenis program Java pertama untuk berinteraksi langsung dengan pengguna untuk karakter keluaran dan masukan, seperti: kita menggunakan JSP dan Servlet mendapatkan karakter yang dikirim oleh klien, dan karakter ini juga menyertakan karakter Cina. Terlepas dari peran kelas Java ini, siklus hidup program Java ini adalah seperti ini:
*Pemrogram memilih perangkat lunak pengeditan yang sesuai pada sistem operasi tertentu untuk mengimplementasikan kode program sumber dan menyimpannya di sistem operasi dengan ekstensi .Java , misalnya, kami menggunakan Notepad untuk mengedit program sumber Java di Windows 2000 Cina.
*Pemrogram menggunakan Javac.exe di JDK untuk mengkompilasi kode sumber ini untuk membentuk kelas .class (file JSP dikompilasi oleh container yang memanggil JDK).
*Jalankan kelas-kelas ini secara langsung atau terapkan kelas-kelas ini ke wadah WEB untuk menjalankan dan mengeluarkan hasilnya.
Jadi, selama proses ini, bagaimana JDK dan JVM menyandikan, mendekode, dan menjalankan file-file ini?
Di sini, kami mengambil sistem operasi Cina Windows 2000 sebagai contoh untuk mengilustrasikan bagaimana kelas Java dikodekan dan didekode.
Langkah pertama adalah menggunakan perangkat lunak pengeditan seperti Notepad untuk menulis file program sumber Java (termasuk lima jenis program Java di atas) pada Windows 2000 Cina. Saat menyimpan file program, file program menggunakan format pengkodean GBK yang didukung oleh sistem operasi secara default (didukung oleh sistem operasi secara default). Formatnya adalah format file.encoding) membentuk file .Java, artinya sebelum program Java dikompilasi, file program sumber Java kita disimpan di file.encoding. format pengkodean yang didukung oleh sistem operasi secara default. Dalam program sumber Java Berisi karakter informasi berbahasa Mandarin dan kode program berbahasa Inggris; untuk melihat parameter file.encoding sistem, Anda dapat menggunakan kode berikut:
public class ShowSystemDefaultEncoding;
{
public static void main(String[] args)
{
Pengkodean string =
System.getProperty("file.encoding");
System.out.println(pengkodean);
}
}
Pada langkah kedua, kita menggunakan file Javac.exe JDK untuk mengkompilasi program sumber Java kita. Karena JDK adalah versi internasional, saat kompilasi, kita tidak menggunakan parameter -encoding untuk menentukan format pengkodean sumber Java kita. program, maka Javac.exe terlebih dahulu memperoleh format pengkodean yang digunakan oleh sistem operasi kita secara default. Artinya, ketika mengkompilasi program Java, jika kita tidak menentukan format pengkodean file program sumber, JDK terlebih dahulu memperoleh parameter file.encoding. sistem operasi (yang menyimpan format pengkodean default, seperti Windows2000, nilainya adalah GBK), dan kemudian JDK mengubah program sumber Java kami dari format pengkodean file.encoding ke format UNICODE default internal Java dan memasukkannya ke dalam memori.
Kemudian, Javac mengkompilasi file format unicode yang dikonversi menjadi file kelas .class. Saat ini, file .class dikodekan UNICODE, dan untuk sementara ditempatkan di memori. Kemudian, JDK mengkompilasi kelas yang dikompilasi dalam pengkodean UNICODE disimpan ke sistem operasi kami untuk membentuk file .class yang kami lihat.
Bagi kami, file .class yang akhirnya kami peroleh adalah file kelas yang isinya disimpan dalam format pengkodean UNICODE. Ini berisi string Cina dalam program sumber kami, tetapi saat ini telah dikonversi ke format UNICODE melalui format file.encoding. .
Pada langkah ini, file program sumber JSP berbeda. Untuk JSP, prosesnya seperti ini: yaitu, wadah WEB memanggil kompiler JSP. Kompiler JSP terlebih dahulu memeriksa apakah format pengkodean file diatur dalam file JSP tidak ada format pengkodean file dalam file JSP, Untuk mengatur format pengkodean file JSP, kompiler JSP memanggil JDK untuk terlebih dahulu mengkonversi file JSP menjadi kelas Servlet sementara menggunakan format pengkodean karakter default JVM (yaitu, default file.encoding sistem operasi tempat wadah WEB berada), dan kemudian dikompilasi ke dalam kelas format UNICODE dan disimpan dalam folder sementara.
Misalnya: Pada Windows 2000 Cina, wadah WEB mengubah file JSP dari format pengkodean GBK ke format UNICODE, dan kemudian mengkompilasinya menjadi kelas Servlet yang disimpan sementara untuk menanggapi permintaan pengguna.
Langkah ketiga adalah menjalankan kelas yang dikompilasi pada langkah kedua, yang dibagi menjadi tiga situasi:
A. Kelas yang berjalan langsung di konsol
B. Kelas EJB dan kelas pendukung yang tidak dapat dijalankan secara langsung (seperti kelas JavaBean)
C. Kode JSP dan kelas Servlet
D. Antara program Java dan database
Mari kita lihat empat situasi di bawah ini.
A. Dalam kasus kelas yang berjalan langsung di konsol
, menjalankan kelas ini terlebih dahulu memerlukan dukungan JVM, yaitu JRE harus diinstal di sistem operasi. Proses yang berjalan adalah seperti ini: Pertama, Java memulai JVM. Pada saat ini, JVM membaca file kelas yang disimpan dalam sistem operasi dan membaca konten ke dalam memori. dan kemudian JVM menjalankannya. Jika saat ini Jika kelas ini perlu menerima input pengguna, kelas akan menggunakan format pengkodean file.encoding secara default untuk mengkodekan input string oleh pengguna dan mengubahnya menjadi unicode dan menyimpannya ke dalam memori. (pengguna dapat mengatur format pengkodean aliran input).
Setelah program berjalan, string yang dihasilkan (dikodekan UNICODE) dikembalikan ke JVM. Terakhir, JRE mengubah string menjadi format file.encoding (pengguna dapat mengatur format pengkodean aliran keluaran) dan meneruskannya ke sistem operasi. menampilkan antarmuka dan mengeluarkannya ke antarmuka. Setiap langkah konversi di atas memerlukan konversi format pengkodean yang benar sehingga karakter yang kacau tidak akan muncul pada akhirnya. B. Kelas EJB dan kelas pendukung yang tidak dapat dijalankan secara langsung (seperti kelas JavaBean)
Karena kelas EJB dan kelas pendukung tidak dapat dijalankan secara langsung, umumnya tidak berinteraksi langsung dengan pengguna untuk input dan output untuk input dan output, jadi setelah dikompilasi pada langkah kedua, mereka membentuk kelas yang isinya berkode UNICODE dan disimpan di sistem operasi di masa mendatang, selama tidak ada interaksi antara kelas tersebut dan kelas lain hilang selama proses passing parameter, maka akan berjalan dengan benar.
C.
Setelah langkah kedua dari kode JSP dan kelas Servlet, file JSP juga diubah menjadi file kelas Servlets, tetapi tidak ada di direktori kelas seperti Servlets standar. File tersebut ada di direktori sementara wadah WEB , jadi pada langkah ini kita juga melihatnya sebagai Servlet.
Untuk Servlet, ketika klien memintanya, wadah WEB memanggil JVM-nya untuk menjalankan Servlet. Pertama, JVM membaca kelas Servlet dari sistem dan memuatnya ke dalam memori. Di dalam memori terdapat kode kelas Servlet yang dikodekan UNICODE. Kemudian JVM menjalankan kelas Servlet di memori. Jika Servlet sedang berjalan, ia perlu menerima karakter dari klien, seperti nilai yang dimasukkan dalam formulir dan nilai yang diteruskan dalam URL waktu, jika program tidak disetel untuk menerima Jika format pengkodean digunakan sebagai parameter, wadah WEB akan menggunakan format pengkodean ISO-8859-1 secara default untuk menerima nilai yang masuk dan mengubahnya menjadi format UNICODE di JVM dan simpan di memori wadah WEB.
Setelah Servlet dijalankan, ia menghasilkan keluaran, dan string keluaran dalam format UNICODE. Kemudian, wadah langsung mengirimkan string format UNICODE (seperti sintaks HTML, string keluaran pengguna, dll.) yang dihasilkan oleh proses Servlet ke klien. browser dan menampilkannya ke Jika pengguna menentukan format pengkodean untuk keluaran saat mengirim saat ini, maka akan ditampilkan ke browser dalam format pengkodean yang ditentukan, maka akan dikirim ke browser pelanggan dalam ISO-8859-. 1 pengkodean secara default.
D. Antara program Java dan database
Untuk hampir semua driver database JDBC, format pengkodean default untuk mentransfer data antara program Java dan database adalah ISO-8859-1. Oleh karena itu, program kami mentransmisikan data ke database Saat menyimpan data yang mengandung bahasa Mandarin programnya, JDBC pertama-tama mengubah data dalam format pengkodean UNICODE di dalam program ke dalam format ISO-8859-1, dan kemudian meneruskannya ke database. Saat database menyimpan data, defaultnya adalah penyimpanan ISO-8859-1, jadi inilah sebabnya data berbahasa Mandarin yang sering kita baca di database kacau.
3. Beberapa prinsip yang harus dipahami saat menganalisis masalah umum Java Cina
. Pertama, setelah analisis mendetail di atas, kita dapat melihat dengan jelas bahwa dalam siklus hidup program Java apa pun, proses kunci konversi pengkodean adalah: awalnya dikompilasi ke dalam kelas file Hasil proses transcoding dan transcoding akhir ke pengguna.
Kedua, kita harus memahami bahwa format pengkodean yang umum digunakan berikut ini yang didukung oleh Java pada waktu kompilasi adalah:
*ISO-8859-1, 8-bit, sama dengan 8859_1, ISO-8859-1, ISO_8859_1 dan pengkodean lainnya
*Cp1252, Amerika Pengkodean bahasa Inggris, sama dengan pengkodean standar ANSI
*UTF-8, sama dengan pengkodean unicode
*GB2312, sama dengan gb2312-80, gb2312-1980 dan pengkodean lainnya
*GBK, sama dengan MS936, ini merupakan perluasan dari gb2312 dan pengkodean lainnya, seperti Korea, Jepang, Cina Tradisional, dll. Pada saat yang sama, kita harus memperhatikan hubungan kompatibilitas antara pengkodean ini sebagai berikut:
Pengkodean Unicode dan UTF-8 memiliki korespondensi satu-ke-satu. GB2312 dapat dianggap sebagai bagian dari GBK, yaitu pengkodean GBK diperluas pada gb2312. Pada saat yang sama, pengkodean GBK berisi 20902 karakter Cina, dan rentang pengkodean adalah: 0×8140-0xfefe. Semua karakter dapat dipetakan ke UNICODE2.0 satu-ke-satu.
Ketiga, untuk file program sumber .Java yang ditempatkan di sistem operasi, selama kompilasi, kita dapat menentukan format pengkodean kontennya, khususnya menggunakan -encoding. Catatan: Jika program sumber berisi karakter Cina dan Anda menggunakan -encoding untuk menentukan karakter pengkodean lainnya, kesalahan jelas akan terjadi.
Gunakan -encoding untuk menentukan metode pengkodean file sumber sebagai GBK atau gb2312. Tidak peduli sistem apa yang kita gunakan untuk mengkompilasi program sumber Java yang berisi karakter berbahasa Mandarin, tidak akan ada masalah. Ini akan mengubah bahasa Mandarin menjadi UNICODE dengan benar dan menyimpannya di berkas kelas.
Kemudian, kita harus jelas bahwa format pengkodean karakter default di hampir semua wadah WEB menggunakan ISO-8859-1 sebagai nilai default. Pada saat yang sama, hampir semua browser menggunakan UTF-8 secara default saat meneruskan parameter .
Oleh karena itu, meskipun file sumber Java kami menentukan metode pengkodean yang benar saat masuk dan keluar, file tersebut masih diproses sebagai ISO-8859-1 saat dijalankan di dalam container.
4. Klasifikasi masalah bahasa Mandarin dan solusi optimal yang disarankan.
Setelah memahami prinsip pemrosesan file Java di atas, kami dapat mengajukan serangkaian solusi optimal yang disarankan untuk masalah karakter Cina. Tujuan kami adalah: program sumber Java yang berisi string berbahasa Mandarin atau pemrosesan berbahasa Mandarin yang kami edit di sistem berbahasa Mandarin dapat dimigrasikan ke sistem operasi lain agar berjalan dengan benar setelah kompilasi, atau dapat dikompilasi di sistem operasi lain melewati parameter berbahasa Mandarin dan Inggris, dan dapat mengkomunikasikan string berbahasa Mandarin dan Inggris dengan database dengan benar. Ide khusus kami adalah untuk membatasi metode pengkodean agar benar pada pintu masuk dan keluar dari transcoding program Java dan di mana program Java memiliki konversi input dan output dengan pengguna.
Solusi spesifiknya adalah sebagai berikut:
1. Untuk kelas yang berjalan langsung di konsol
, dalam hal ini, kami menyarankan saat menulis program, jika Anda perlu menerima masukan dari pengguna yang mungkin berisi bahasa Mandarin atau keluaran yang mungkin berisi bahasa Mandarin, program harus menggunakan Aliran karakter yang digunakan untuk menangani input dan output. Secara khusus, tipe aliran node berorientasi karakter berikut diterapkan:
Untuk file: FileReader, FileWrieter,
tipe aliran node berorientasi byte adalah: FileInputStream, FileOutputStream
Untuk memori (array) ): CharArrayReader,
CharArrayWriter Jenis aliran node adalah: ByteArrayInputStream, ByteArrayOutputStream.
Memori (string): StringReader, StringWriter.
Pipa
: PipedReader, PipedWriter.
Jenis aliran node byte adalah: PipedInputStream, PipedOutputStream.
aliran pemrosesan berorientasi harus digunakan. Input dan output:
BufferedWriter, BufferedReader,
aliran pemrosesan tipe byte-nya adalah: BufferedInputeStream, BufferedOutputStream
InputStreamReader, OutputStreamWriter,
aliran pemrosesan tipe byte-nya adalah: DataInputStream,
DataOutputStreamReader dan InputStreamWriter digunakan untuk mengonversi aliran byte sesuai dengan kumpulan pengkodean karakter yang ditentukan. Konversikan ke aliran karakter, seperti:
InputStreamReader in = new InputStreamReader(System.in, "GB2312"); contoh: contoh pengkodean Java berikut dapat memenuhi persyaratan:
//Read.Java
impor Java.io.*;
kelas publik Baca
{
public static void main(String[] args)
throwsIOException
{
Tali str =
"nTes bahasa Mandarin, ini adalah string hard-code internal "+"nkarakter bahasa Inggris tes";
Tali tali = "";
BufferedReader stdin =
BufferedReader baru (baru
InputStreamReader(Sistem.di,”gb2312″));
//Atur antarmuka masukan untuk dikodekan dalam bahasa Mandarin
BufferedWriter stdout =
BufferedWriter baru (baru
OutputStreamWriter(Sistem.keluar,”gb2312″));
//Atur antarmuka keluaran untuk dikodekan dalam bahasa Cina
stdout.write("Silakan masukkan:");
stdout.flush();
strin = stdin.readLine();
stdout.write("Ini adalah string yang dimasukkan oleh pengguna:"+strin);
stdout.write(str);
stdout.flush();
}}
Pada saat yang sama, saat mengkompilasi program, kami menggunakan metode berikut:
Javac -encoding gb2312 Read.Java
2. Untuk kelas EJB dan kelas pendukung yang tidak dapat dijalankan secara langsung (seperti kelas JavaBean),
karena kelas tersebut sendiri digunakan oleh kelas lain Panggilan tersebut tidak berinteraksi langsung dengan pengguna, jadi untuk jenis ini, metode pemrosesan yang kami rekomendasikan adalah program internal harus menggunakan aliran karakter untuk memproses string berbahasa Mandarin di dalam program (khususnya seperti pada bagian di atas), dan pada saat yang sama, di Saat mengkompilasi kelas, gunakan parameter -encoding gb2312 untuk menunjukkan bahwa file sumber dikodekan dalam format Cina.
3. Untuk kelas Servlet
, kami merekomendasikan metode berikut:
Saat mengkompilasi program sumber kelas Servlet, gunakan -encoding untuk menentukan pengkodean sebagai GBK atau GB2312, dan gunakan setContentType("text" dari objek respons dalam pengkodean bagian saat mengeluarkan ke pengguna /html;charset=GBK”); atau gb2312 untuk mengatur format pengkodean keluaran. Demikian pula saat menerima masukan pengguna, kami menggunakan request.setCharacterEncoding(”GB2312″); kelas servlet kami ditransplantasikan ke, hanya klien Jika browser Anda mendukung tampilan berbahasa Mandarin, itu akan ditampilkan dengan benar. Berikut ini contoh yang benar:
//HelloWorld.Java
paket halo;
impor Java.io.*;
import Javax.servlet.*;
impor Javax.servlet.http.*;
kelas publik HelloWorld
memperluas HttpServlet
{
kekosongan publik init()
melempar ServletException
{
}
kekosongan publik doGet
(Permintaan HttpServletRequest,
Respons HttpServletResponse)
melempar IOException, ServletException
{
permintaan.setCharacterEncoding("GB2312");
//Mengatur format pengkodean masukan
respon.setContentType
("teks/html;rangkaian karakter=GB2312");
//Mengatur format pengkodean keluaran
PrintWriter keluar = respon.getWriter();
//Direkomendasikan untuk menggunakan keluaran PrintWriter
keluar.println(”<jam>”);
out.println("Halo Dunia!
Ini dibuat oleh Servlet!Test Chinese!");
keluar.println(”<jam>”);
}
public void doPost (permintaan HttpServletRequest,
Respons HttpServletResponse)
melempar IOException, ServletException
{
permintaan.setCharacterEncoding("GB2312");
//Mengatur format pengkodean masukan
respon.setContentType
("teks/html;rangkaian karakter=GB2312");
//Mengatur format pengkodean keluaran
String nama = permintaan.getParameter("nama");
String id = permintaan.getParameter("id");
if(nama==null) nama="";
jika(id==batal) id="";
PrintWriter keluar = respon.getWriter();
//Direkomendasikan untuk menggunakan keluaran PrintWriter
keluar.println(”<jam>”);
out.println("String berbahasa Mandarin yang Anda masukkan adalah: " + nama);
out.println("<hr>ID yang anda masukkan adalah : "+id);
keluar.println(”<jam>”);
}
kehancuran publik ()
{
}
}
Silakan gunakan Javac -encoding gb2312 HelloWorld.Java untuk mengkompilasi program ini.
Program untuk menguji Servlet ini adalah sebagai berikut:
< %@page contentType="text/html;
rangkaian karakter=gb2312″%>
<%request.setCharacterEncoding("GB2312");%>
<html><kepala><judul></judul>
<Bahasa skrip="JavaScript">
fungsi Kirim()
{
//Melalui nilai string berbahasa Mandarin ke Servlet melalui URL
dokumen.base.action =
"./HelloWorld?name=中文";
dokumen.base.method = “POSTING”;
dokumen.base.submit();
}
</Skrip>
</head>
<tubuh bgcolor=”#FFFFFF”
teks=”#000000″ margin atas=”5″>
<nama formulir="dasar" metode =
“POSTING” target=”_diri”>
<masukan nama="id" type="teks"
nilai=”” ukuran=”30″>
<a href = “JavaScript:Kirim()">
Lulus ke Servlet</a>
</bentuk></tubuh></html>
4.
Untuk menghindari data yang kacau dalam transfer data antara program Java dan database, kami merekomendasikan metode optimal berikut untuk menanganinya:
1. Program Java harus diproses sesuai dengan metode yang kami tentukan.
2. Ubah format pengkodean yang didukung oleh database secara default menjadi GBK atau GB2312.
Misalnya: di mysql, kita dapat menambahkan pernyataan berikut ke file konfigurasi my.ini untuk mencapai hal ini:
tambahkan:default-character-set=gbk
di area [mysqld]
dan tambahkan:
[client]
default-character-set=gbk
Di SQL Server2K, kita dapat mengatur bahasa default database ke Bahasa Cina Sederhana untuk mencapai tujuan.
5. Untuk kode JSP,
karena JSP dikompilasi secara dinamis oleh wadah WEB saat runtime, jika kita tidak menentukan format pengkodean file sumber JSP, kompiler JSP akan mendapatkan nilai file.encoding dari sistem operasi server untuk mengkompilasi File JSP. Ya, kemungkinan besar menyebabkan masalah saat transplantasi. Misalnya, file jsp yang dapat berjalan dengan baik di Windows 2000 Cina tidak akan berfungsi di Linux Inggris, meskipun kliennya sama file JSP saat mengkompilasinya. Disebabkan oleh pengkodean sistem operasi yang berbeda (file.encoding dalam bahasa Cina wink berbeda dengan file.encoding dalam bahasa Inggris Linux, dan file.encoding dalam bahasa Inggris Linux tidak mendukung bahasa Cina, jadi akan ada masalah dengan file tersebut. kelas JSP yang dikompilasi).
Sebagian besar masalah yang dibahas di Internet adalah masalah seperti itu, terutama karena file JSP tidak dapat ditampilkan dengan benar ketika ditransplantasikan ke platform. Untuk masalah seperti ini, kami memahami prinsip konversi pengkodean program di Java, dan itu jauh lebih mudah menyelesaikannya. Solusi yang kami sarankan adalah sebagai berikut:
1. Kami harus memastikan bahwa JSP dikeluarkan dalam pengkodean bahasa Mandarin ketika dikeluarkan ke klien, yaitu, apa pun yang terjadi, pertama-tama kami menambahkan baris berikut ke kode sumber JSP kami:
< %@page contentType =”teks/html;
Charset = GB2312 ″%>
2. Untuk memungkinkan JSP memperoleh parameter yang masuk dengan benar, kami menambahkan kalimat berikut ke header file sumber JSP:
<%request.setcharacterencoding (”GB2312 ″);
%>
3. Agar kompiler JSP untuk mendekode dengan benar file JSP kami yang berisi karakter Cina, kami perlu menentukan format pengkodean file sumber JSP kami dalam file sumber JSP.
file sumberheader file sumber JSP.
Atau < %@ pageEncoding = "GBK" %>
Ini adalah instruksi yang baru ditambahkan dalam spesifikasi JSP 2.0.
Kami merekomendasikan untuk menggunakan metode ini untuk memecahkan masalah Cina dalam file JSP
.
< %@ pageEncoding = ”GB2312 ″ %>
< %@page contentType = "Teks/html;
Charset = GB2312 ″%>
<%request.setcharacterencoding ("GB2312");
%>
<%
String action = request.getParameter ("action");
String name = "";
String str = "";
if (action! = null && action.equals ("send"))
{
name = request.getParameter ("name");
str = request.getParameter ("str");
}
%>
<html>
<kepala>
<judul></judul>
<Bahasa skrip = "javascript">
Fungsi Kirim ()
{
document.base.action =
"? Action = Send & Str = Masuk Cina";
document.base.method = “post”;
document.base.submit ();
}
</Skrip>
</kepala>
<body bgcolor = "#ffffff"
Text = ”#000000 ″ Topmargin =” 5 ″>
<Form name = "Base" Metode =
“POST” Target = ”_ Self”>
<input type = "text" name = "name"
value = "" size = "30 ″>
<a href = "javascript: kirim ()"> kirim </a>
</bentuk>
<%
if (action! = null && action.equals ("send"))
{
out.println ("<br> Karakter yang Anda masukkan adalah:"+nama);
out.println ("<br> Karakter yang Anda lewati melalui URL adalah:"+str);
}
%>
</tubuh>
</html>