it-swarm-tr.com

Dizeleri Java'da UTF8 bayt dizilerine dönüştürme ve dönüştürme

Java'da bir String'im var ve onu bir bayt dizisi olarak kodlamak istiyorum (UTF8'de veya başka bir kodlamada). Alternatif olarak, bir byte dizisine sahibim (bazı kodlamalarda) ve onu bir Java Stringine dönüştürmek istiyorum. Bu dönüşümleri nasıl yaparım?

215
mcherm

String'den byte'a dönüştür []:

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

Bayt [] 'dan String' e dönüştür:

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

Elbette doğru kodlama adını kullanmalısınız. Örneklerim, en yaygın iki kodlama olan US-ASCII ve UTF-8'i kullandı.

305
mcherm

İşte, her dönüşüm için Charset aramasını gerçekleştirmekten kaçınan bir çözüm:

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

Doğrudan String (byte [], String) constructor ve getBytes (String) yöntemiyle dönüştürebilirsiniz. Java, kullanılabilir karakter setlerini Charset sınıfı aracılığıyla gösterir. JDK belgeleri desteklenen kodlamaları listeler .

Zamanın% 90'ı, bu tür dönüşümler akışlarda gerçekleştirilir, bu nedenle Reader / Writer sınıflarını kullanırsınız. Keyfi bayt akışlarında String yöntemlerini kullanarak aşamalı olarak kod çözmeyeceksiniz - çok baytlık karakterleri içeren hatalara açık kalacaksınız.

14
McDowell

Tomcat7 uygulamam, dizeleri ISO-8859-1 olarak kabul ediyor; HTTP isteğinin içerik türüne rağmen. 'É' gibi karakterleri doğru şekilde yorumlamaya çalışırken aşağıdaki çözüm benim için çalıştı.

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

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

Dizeyi US-ASCII olarak yorumlamaya çalışırken, bayt bilgisi doğru yorumlanmadı.

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

Alternatif olarak, Apache Commons'dan StringUtils kullanılabilir.

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

veya

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

Standart olmayan bir karakter diziniz varsa getBytesUnchecked () veya newString () komutunu kullanabilirsiniz.

7
vtor

Bir dizi baytın normal bir dize mesajına kodunu çözmek için nihayet UTF-8 ile bu kodla kodlamayı çalıştırdım:

/* 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

7-bit ASCII veya ISO-8859-1 (şaşırtıcı şekilde yaygın bir format) kullanıyorsanız, yeni bir Java.lang.String oluşturmak zorunda değilsiniz . Bayt'ı char'a çevirmek çok daha fazla performans gösterir:

Tam çalışma örneği:

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

=, Æ, Å, Ç, Ï, Ê gibi genişletilmiş karakterleri kullanarak kullanmıyorsanız . ve yalnızca iletilen değerlerin ilk 128 Unicode karakterinden olduğundan emin olabilirler, bu durumda bu kod UTF-8 için de çalışacaktır ve genişletilmiş ASCII (cp-1252 gibi).

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));

Yorum yapamam ama yeni bir konu başlatmak istemiyorum. Ama bu çalışmıyor. Basit bir gidiş dönüş:

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

B [] aynı diziye, kodlamadan önce ve sonra aynı olana ihtiyaç duyardım (bu ilk cevabı ifade eder).

0
jschober