Di pulau Jawa, saya punya String dan saya ingin meng-encode sebagai byte array (dalam UTF8, atau beberapa lainnya encoding). Secara bergantian, saya memiliki sebuah array byte (di beberapa encoding) dan saya ingin mengubahnya menjadi Java String. Bagaimana cara melakukan konversi tersebut?
Konversi dari String ke byte[]:
String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
Mengkonversi dari byte[] untuk String:
byte[] b = {(byte) 99, (byte)97, (byte)116};
String s = new String(b, StandardCharsets.US_ASCII);
Anda harus, tentu saja, menggunakan pengkodean yang benar nama. Contoh saya menggunakan US-ASCII dan UTF-8, dua yang paling umum pengkodean.
Berikut ini's solusi yang menghindari melakukan Charset lookup 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);
}
String original = "hello world";
byte[] utf8Bytes = original.getBytes("UTF-8");
Anda dapat mengkonversi langsung melalui String(byte[], String) konstruktor dan getBytes(String) metode. Jawa memperlihatkan rangkaian karakter yang tersedia melalui Charset kelas. JDK dokumentasi daftar didukung pengkodean.
90% dari waktu, konversi tersebut akan dilakukan pada sungai, sehingga anda'd gunakan Pembaca/Penulis kelas. Anda tidak akan secara bertahap decode menggunakan metode String pada sewenang-wenang byte stream - anda akan meninggalkan diri anda terbuka untuk bug yang melibatkan karakter multibyte.
Saya tomcat7 implementasi adalah menerima string sebagai ISO-8859-1; meskipun kandungan-jenis permintaan HTTP. Berikut solusi yang bekerja untuk saya ketika mencoba untuk benar menafsirkan karakter seperti 'é' .
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 untuk menginterpretasikan string US-ASCII, byte info wasn't ditafsirkan dengan benar.
b1 = szP1.getBytes("US-ASCII");
System.out.println(b1.toString());
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 non-standar set karakter, anda dapat menggunakan getBytesUnchecked() atau newString() dengan demikian.
Untuk decoding serangkaian byte ke normal string pesan saya akhirnya berhasil bekerja dengan encoding 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"));
}
Jika anda menggunakan 7-bit ASCII atau ISO-8859-1 (yang luar biasa format umum) maka anda don't harus membuat yang baru jawa.lang.String pada semua. It's jauh lebih tampak hanya melemparkan byte ke char:
Bekerja penuh contoh:
for (byte b : new byte[] { 43, 45, (byte) 215, (byte) 247 }) {
char c = (char) b;
System.out.print(c);
}
Jika anda tidak menggunakan extended-karakter suka Ä, Æ, Å, Ç, Ï, Ê dan dapat yakin bahwa hanya ditularkan nilai-nilai yang pertama 128 karakter Unicode, maka kode ini juga akan bekerja untuk UTF-8 dan extended ASCII (seperti cp-1252).
//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));
Saya dapat't komentar tapi don't ingin memulai thread baru. Tapi ini isn't bekerja. Sederhana round trip:
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
I'a butuh b[] array yang sama sebelum dan setelah pengkodean yang isn't (ini referer untuk jawaban pertama).
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);
sangat terlambat tapi aku hanya mengalami masalah ini dan ini adalah saya perbaiki:
private static String removeNonUtf8CompliantCharacters( final String inString ) {
if (null == inString ) return null;
byte[] byteArr = inString.getBytes();
for ( int i=0; i < byteArr.length; i++ ) {
byte ch= byteArr[i];
// remove any characters outside the valid UTF-8 range as well as all control characters
// except tabs and new lines
if ( !( (ch > 31 && ch < 253 ) || ch == '\t' || ch == '\n' || ch == '\r') ) {
byteArr[i]=' ';
}
}
return new String( byteArr );
}