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?
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ı.
İş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);
}
String original = "hello world";
byte[] utf8Bytes = original.getBytes("UTF-8");
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.
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());
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.
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"));
}
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).
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);
//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);
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).