Как конвертировать строки в массивы байтов UTF8 и из них в Java
в Java у меня есть строка, и я хочу кодировать ее как массив байтов (в UTF8 или в какой-либо другой кодировке). Кроме того, у меня есть массив байтов (в некоторой известной кодировке), и я хочу преобразовать его в строку Java. Как мне сделать эти преобразования?
13 ответов:
преобразовать из String в Byte[]:
String s = "some text here"; byte[] b = s.getBytes("UTF-8");преобразование из Byte[] в строку:
byte[] b = {(byte) 99, (byte)97, (byte)116}; String s = new String(b, "US-ASCII");вы должны, конечно, использовать правильное название кодировки. В моих примерах использовались "US-ASCII" и "UTF-8", две наиболее распространенные кодировки.
вот решение, которое позволяет избежать выполнения поиска кодировки для каждого преобразования:
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 (byte[], String) конструктор и метод getBytes (String). Java предоставляет доступные наборы символов через Charset класса. Документация JDK список поддерживаемых кодировок.
90% времени такие преобразования выполняются в потоках, поэтому вы должны использовать читатель/писатель классы. Вы не будете последовательно декодировать с помощью строковых методов на произвольном байте потоки-вы бы оставили себя открытыми для ошибок, связанных с многобайтовыми символами.
моя реализация tomcat7 принимает строки как ISO-8859-1; несмотря на тип содержимого HTTP-запроса. Следующее решение работало для меня при попытке правильно интерпретировать символы, такие как "é".
byte[] b1 = szP1.getBytes("ISO-8859-1"); System.out.println(b1.toString()); String szUT8 = new String(b1, "UTF-8"); System.out.println(szUT8);при попытке интерпретировать строку как US-ASCII, байт информация не была правильно интерпретирована.
b1 = szP1.getBytes("US-ASCII"); System.out.println(b1.toString());
в качестве альтернативы, StringUtils из Apache Commons можно использовать.
byte[] bytes = {(byte) 1}; String convertedString = StringUtils.newStringUtf8(bytes);или
String myString = "example"; byte[] convertedBytes = StringUtils.getBytesUtf8(myString);Если у вас нестандартная кодировка, вы можете использовать getBytesUnchecked() или newString() соответственно.
Если вы используете 7-битный ASCII или ISO-8859-1 (Удивительно распространенный формат), то вам не нужно создавать новый java.ленг.Строка на всех. Это гораздо более эффективно, чтобы просто бросить байт в char:
полный рабочий пример:
for (byte b : new byte[] { 43, 45, (byte) 215, (byte) 247 }) { char c = (char) b; System.out.print(c); }Если вы не используя расширенные-символы как Ä, Æ, Å, Ç, Ï, Ê и может быть уверен, что только переданные значения первых 128 символов Юникода, то этот код также будет работать для UTF-8 и расширенного ASCII (например, cp-1252).
для декодирования серии байтов в обычное строковое сообщение я наконец-то получил его работу с кодировкой UTF-8 с этим кодом:
/* 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")); }
//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);
Я не могу комментировать, но не хочу начинать новый поток. Но это не работает. Простая поездка туда и обратно:
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[] тот же массив до и после кодирования, которого нет (это относится к первому ответу).
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);
Reader reader = new BufferedReader( new InputStreamReader( new ByteArrayInputStream( string.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));
ужасно поздно, но я только что столкнулся с этой проблемой, и это мое исправление:
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 ); }
Comments