utf8 getbytes example convertir codificar java string encoding character-encoding

example - java string.getbytes encoding utf 8



Cómo convertir cadenas ay desde matrices de bytes UTF8 en Java (13)

Aquí hay una solución que evita realizar la búsqueda de Charset para cada conversión:

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

En Java, tengo una cadena y quiero codificarla como una matriz de bytes (en UTF8, o alguna otra codificación). Alternativamente, tengo una matriz de bytes (en alguna codificación conocida) y quiero convertirla en una cadena Java. ¿Cómo hago estas conversiones?


Como alternativa, se pueden usar StringUtils de Apache Commons.

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

o

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

Si tiene un getBytesUnchecked() caracteres no estándar, puede usar getBytesUnchecked() o newString() consecuencia.


Convertir de cadena a byte []:

String s = "some text here"; byte[] b = s.getBytes("UTF-8");

Convertir de byte [] a String:

byte[] b = {(byte) 99, (byte)97, (byte)116}; String s = new String(b, "US-ASCII");

Por supuesto, debe utilizar el nombre de codificación correcto. Mis ejemplos utilizaron "US-ASCII" y "UTF-8", las dos codificaciones más comunes.


La implementación de mi tomcat7 está aceptando cadenas como ISO-8859-1; A pesar del tipo de contenido de la solicitud HTTP. La siguiente solución funcionó para mí al intentar interpretar correctamente los caracteres como ''é''.

byte[] b1 = szP1.getBytes("ISO-8859-1"); System.out.println(b1.toString()); String szUT8 = new String(b1, "UTF-8"); System.out.println(szUT8);

Al intentar interpretar la cadena como US-ASCII, la información del byte no se interpretó correctamente.

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


No puedo comentar pero no quiero comenzar un nuevo hilo. Pero esto no está funcionando. Un simple viaje de ida y vuelta:

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

Necesitaría b [] la misma matriz antes y después de codificar, lo que no es (esto se refiere a la primera respuesta).


Para decodificar una serie de bytes en un mensaje de cadena normal, finalmente lo conseguí trabajando con la codificación UTF-8 con este código:

/* 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")); }


Puede realizar la conversión directamente mediante el constructor String (byte [], String) y el método getBytes (String). Java expone los juegos de caracteres disponibles a través de la clase Charset . La documentación de JDK enumera las codificaciones soportadas .

El 90% de las veces, estas conversiones se realizan en secuencias, por lo que utilizarías las clases Reader / Writer . No descodificaría de forma incremental utilizando los métodos de String en flujos de bytes arbitrarios, sino que se dejaría abierto a errores que involucren caracteres multibyte.


Si está utilizando ASCII de 7 bits o ISO-8859-1 (un formato sorprendentemente común), entonces no tiene que crear una nueva java.lang.String . Es mucho más eficaz simplemente lanzar el byte en char:

Ejemplo de trabajo completo:

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

Si no está utilizando caracteres extendidos como Ä, Æ, Å, Ç, Ï, Ê y puede estar seguro de que los únicos valores transmitidos son los primeros 128 caracteres Unicode, entonces este código también funcionará para UTF-8 y ASCII extendido (como cp-1252).


terriblemente tarde pero acabo de encontrar este problema y esta es mi solución:

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


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


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


String original = "hello world"; byte[] utf8Bytes = original.getBytes("UTF-8");