it-swarm-id.com

Bagaimana mengkonversi Strings ke dan dari array byte UTF8 di Jawa

Di Jawa, saya memiliki sebuah String dan saya ingin menyandikannya sebagai array byte (dalam UTF8, atau beberapa pengkodean lainnya). Bergantian, saya memiliki array byte (dalam beberapa pengkodean dikenal) dan saya ingin mengubahnya menjadi String Java. Bagaimana saya melakukan konversi ini?

215
mcherm

Konversi dari String ke byte []:

String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);

Konversi dari byte [] ke String:

byte[] b = {(byte) 99, (byte)97, (byte)116};
String s = new String(b, StandardCharsets.US_ASCII);

Anda harus, tentu saja, menggunakan nama penyandian yang benar. Contoh saya menggunakan US-ASCII dan UTF-8, dua penyandian yang paling umum.

305
mcherm

Berikut adalah solusi yang menghindari melakukan pencarian Charset untuk setiap konversi:

import Java.nio.charset.Charset;

private final Charset UTF8_CHARSET = Charset.forName("UTF-8");

String decodeUTF8(byte[] bytes) {
    return new String(bytes, UTF8_CHARSET);
}

byte[] encodeUTF8(String string) {
    return string.getBytes(UTF8_CHARSET);
}
92
M. Leonhard
String original = "hello world";
byte[] utf8Bytes = original.getBytes("UTF-8");
17
Jorge Ferreira

Anda dapat mengonversi secara langsung melalui String (byte [], String) constructor dan getBytes (String) method. Java memperlihatkan set karakter yang tersedia melalui kelas Charset . Dokumentasi JDK daftar penyandian yang didukung .

90% dari waktu, konversi tersebut dilakukan pada aliran, sehingga Anda akan menggunakan kelas Pembaca / Penulis . Anda tidak akan secara bertahap mendekode menggunakan metode String pada stream byte sewenang-wenang - Anda akan membiarkan diri Anda terbuka untuk bug yang melibatkan karakter multibyte.

14
McDowell

Implementasi Tomcat7 saya menerima string sebagai ISO-8859-1; meskipun jenis konten permintaan HTTP. Solusi berikut ini berfungsi untuk saya ketika mencoba menafsirkan karakter seperti 'é' dengan benar.

byte[] b1 = szP1.getBytes("ISO-8859-1");
System.out.println(b1.toString());

String szUT8 = new String(b1, "UTF-8");
System.out.println(szUT8);

Ketika mencoba menafsirkan string sebagai US-ASCII, info byte tidak diartikan dengan benar.

b1 = szP1.getBytes("US-ASCII");
System.out.println(b1.toString());
12
paiego

Sebagai alternatif, StringUtils dari Apache Commons dapat digunakan.

 byte[] bytes = {(byte) 1};
 String convertedString = StringUtils.newStringUtf8(bytes);

atau

 String myString = "example";
 byte[] convertedBytes = StringUtils.getBytesUtf8(myString);

Jika Anda memiliki charset non-standar, Anda dapat menggunakan getBytesUnchecked () atau newString () sesuai.

7
vtor

Untuk mendekode serangkaian byte ke pesan string normal, akhirnya saya dapat menggunakannya dengan pengkodean UTF-8 dengan kode ini:

/* Convert a list of UTF-8 numbers to a normal String
 * Usefull for decoding a jms message that is delivered as a sequence of bytes instead of plain text
 */
public String convertUtf8NumbersToString(String[] numbers){
    int length = numbers.length;
    byte[] data = new byte[length];

    for(int i = 0; i< length; i++){
        data[i] = Byte.parseByte(numbers[i]);
    }
    return new String(data, Charset.forName("UTF-8"));
}
2
Bouke Woudstra

Jika Anda menggunakan 7-bit ASCII atau ISO-8859-1 (format yang luar biasa umum) maka Anda tidak harus membuat Java.lang.String baru . sama sekali. Jauh lebih performant untuk memasukkan byte ke char:

Contoh kerja penuh:

for (byte b : new byte[] { 43, 45, (byte) 215, (byte) 247 }) {
    char c = (char) b;
    System.out.print(c);
}

Jika Anda tidak menggunakan karakter yang diperluas seperti Ä, Æ, Å, Ç, Ï, Ê, Ê dan dapat memastikan bahwa satu-satunya nilai yang dikirimkan adalah dari 128 karakter Unicode pertama, maka kode ini juga akan berfungsi untuk UTF-8 dan diperluas ASCII (seperti cp-1252).

1
Pacerier
Charset UTF8_CHARSET = Charset.forName("UTF-8");
String strISO = "{\"name\":\"א\"}";
System.out.println(strISO);
byte[] b = strISO.getBytes();
for (byte c: b) {
    System.out.print("[" + c + "]");
}
String str = new String(b, UTF8_CHARSET);
System.out.println(str);
0
Nitish Raj
//query is your json   

 DefaultHttpClient httpClient = new DefaultHttpClient();
 HttpPost postRequest = new HttpPost("http://my.site/test/v1/product/search?qy=");

 StringEntity input = new StringEntity(query, "UTF-8");
 input.setContentType("application/json");
 postRequest.setEntity(input);   
 HttpResponse response=response = httpClient.execute(postRequest);
0
Ran Adler
Reader reader = new BufferedReader(
    new InputStreamReader(
        new ByteArrayInputStream(
            string.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));

Saya tidak dapat berkomentar tetapi tidak ingin memulai utas baru. Tapi ini tidak berhasil. Perjalanan pulang-pergi sederhana:

byte[] b = new byte[]{ 0, 0, 0, -127 };  // 0x00000081
String s = new String(b,StandardCharsets.UTF_8); // UTF8 = 0x0000, 0x0000,  0x0000, 0xfffd
b = s.getBytes(StandardCharsets.UTF_8); // [0, 0, 0, -17, -65, -67] 0x000000efbfbd != 0x00000081

Saya perlu b [] array yang sama sebelum dan sesudah pengkodean yang bukan (rujukan ini untuk jawaban pertama).

0
jschober