Kodkan String ke UTF-8 di Java

1. Gambaran keseluruhan

Semasa berurusan dengan String s di Java, kadang-kadang kita perlu menyandikannya ke dalam carset tertentu.

Tutorial ini adalah panduan praktikal yang menunjukkan cara yang berbeza untuk mengekod String ke charset UTF-8 ; untuk menyelam yang lebih teknikal, lihat Panduan kami untuk Pengekodan Karakter.

2. Mendefinisikan Masalah

Untuk mempamerkan pengekodan Java, kami akan bekerjasama dengan String Jerman "Entwickeln Sie mit Vergnügen".

String germanString = "Entwickeln Sie mit Vergnügen"; byte[] germanBytes = germanString.getBytes(); String asciiEncodedString = new String(germanBytes, StandardCharsets.US_ASCII); assertNotEquals(asciiEncodedString, germanString);

Ini String dikodkan menggunakan US_ASCII memberikan kita nilai "entwickeln Sie mit Vergn? Gen" apabila dicetak, kerana ia tidak memahami watak ü bukan ASCII . Tetapi apabila kita menukar String yang dikodkan ASCII yang menggunakan semua aksara bahasa Inggeris menjadi UTF-8, kita mendapat rentetan yang sama.

String englishString = "Develop with pleasure"; byte[] englishBytes = englishString.getBytes(); String asciiEncondedEnglishString = new String(englishBytes, StandardCharsets.US_ASCII); assertEquals(asciiEncondedEnglishString, englishString);

Mari lihat apa yang berlaku apabila kita menggunakan pengekodan UTF-8.

3. Pengekodan Dengan Java Teras

Mari mulakan dengan perpustakaan teras.

String s tidak dapat diubah di Java, yang berarti kita tidak dapat mengubah pengekodan watak String . Untuk mencapai apa yang kita mahukan, kita perlu menyalin bait String dan kemudian membuat yang baru dengan pengekodan yang diinginkan .

Pertama, kami mendapat bait String dan, selepas itu, buat yang baru menggunakan bait yang diambil dan karet yang diingini:

String rawString = "Entwickeln Sie mit Vergnügen"; byte[] bytes = rawString.getBytes(StandardCharsets.UTF_8); String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8); assertEquals(rawString, utf8EncodedString);

4. Pengekodan Dengan Java 7 StandardCharsets

Sebagai alternatif, kita dapat menggunakan kelas StandardCharsets yang diperkenalkan di Java 7 untuk menyandikan String .

Pertama, kita akan menyahkod String menjadi bait dan, kedua, mengekod String ke UTF-8:

String rawString = "Entwickeln Sie mit Vergnügen"; ByteBuffer buffer = StandardCharsets.UTF_8.encode(rawString); String utf8EncodedString = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(rawString, utf8EncodedString);

5. Pengekodan Dengan Commons-Codec

Selain menggunakan Java inti, kita juga dapat menggunakan Apache Commons Codec untuk mencapai hasil yang sama.

Apache Commons Codec adalah pakej berguna yang mengandungi pengekod dan penyahkod ringkas untuk pelbagai format.

Pertama, mari kita mulakan dengan konfigurasi projek. Semasa menggunakan Maven, kita harus menambahkan kebergantungan commons-codec ke pom.xml kami :

 commons-codec commons-codec 1.14 

Kemudian, dalam kes kami, kelas yang paling menarik adalah StringUtils , yang menyediakan kaedah untuk mengekod String s. Menggunakan kelas ini, mendapatkan String yang dikodkan UTF-8 sangat mudah:

String rawString = "Entwickeln Sie mit Vergnügen"; byte[] bytes = StringUtils.getBytesUtf8(rawString); String utf8EncodedString = StringUtils.newStringUtf8(bytes); assertEquals(rawString, utf8EncodedString);

6. Kesimpulannya

Pengekodan String ke UTF-8 tidak sukar, tetapi tidak begitu intuitif. Tutorial ini menyajikan tiga cara untuk melakukannya, sama ada menggunakan Java core atau menggunakan Apache Commons Codec.

Seperti biasa, contoh kod boleh didapati di GitHub.