2008-09-18 41 views

Respuesta

251

Convertir de String a byte []:

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

Convertir de byte [] para la secuencia:

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

Debe, por supuesto, utilizar el nombre de codificación correcta. Mis ejemplos usaron "US-ASCII" y "UTF-8", las dos codificaciones más comunes.

+27

US-ASCII en realidad no es una codificación muy común hoy en día. Windows-1252 e ISO-8859-1 (que son superconjuntos de ASCII) están mucho más extendidos. –

+7

En realidad, me parece bastante común en mi trabajo. A menudo leo flujos de bytes que pueden haberse guardado como Windows-1252 o ISO-8859-1 o incluso como "salida de ese programa heredado que hemos tenido durante los últimos 10 años", pero que contienen bytes garantizados como válidos Caracteres de US-ASCII. También a menudo tengo el requisito de GENERAR dichos archivos (para el consumo por código que puede o no poder manejar caracteres que no sean ASCII. Básicamente, US-ASCII es el "mayor denominador común" de muchas piezas de software. – mcherm

+1

Este método, sin embargo, no informará ningún problema en la conversión. Esto puede ser lo que desee. De lo contrario, se recomienda usar CharsetEncoder en su lugar. –

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

Gracias! Lo escribí de nuevo agregando la otra dirección de conversión. – mcherm

+0

@smink El guión no es opcional. Esto debería usar "UTF-8" –

14

Puede realizar la conversión directamente a través del constructor String(byte[], String) y el método getBytes (String). Java expone conjuntos de caracteres disponibles a través de la clase Charset. La documentación JDK lists supported encodings.

90% del tiempo, tales conversiones se realizan en las transmisiones, por lo que utilizaría las clases Reader/Writer. No se decodificará incrementalmente con los métodos String en secuencias de bytes arbitrarias; se abrirá a errores que involucren caracteres multibyte.

+3

+1 por mencionar caracteres multibyte. – sleske

+0

¿Puedes elaborar? Si mi aplicación codifica y decodifica cadenas en 'UTF-8', ¿cuál es la preocupación con respecto a los caracteres multibytes? – raffian

+0

@raffian Pueden ocurrir problemas si no transforma todos los datos de caracteres de una vez. Ver [aquí] (http://illegalargumentexception.blogspot.co.uk/2009/05/java-rough-guide-to-character-encoding.html#javaencoding_stringclass) para ver un ejemplo. – McDowell

-9

terriblemente tarde, pero yo sólo encontré con 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); 
} 
+1

Esto, por supuesto, es una conversión con pérdida. –

+1

Primero, no es una conversión: es la eliminación de bytes no imprimibles. En segundo lugar, supone que la codificación predeterminada del SO subyacente está realmente basada en ASCII para caracteres imprimibles (por ejemplo, no funcionará en IBM Mainframes utilizando EBCDIC). – Isaac

80

he aquí una solución que evite la realización de las operaciones de búsqueda juego de caracteres 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); 
} 
+0

Ese es un buen punto ... si el rendimiento es crítico, entonces esto ahorraría una pequeña cantidad de tiempo. Solo significativo dentro de un circuito cerrado que no hace mucho más, pero podría ser útil. – mcherm

+4

@mcherm: Incluso si la diferencia de rendimiento es pequeña, prefiero usar objetos (Charset, URL, etc.) sobre sus formas de cadena cuando sea posible. –

+6

Nota: "Desde 1.6 "cadena pública (byte [] bytes, conjunto de caracteres Charset) – leo

1

Si está utilizando 7 -bit ASCII o ISO-8859-1 (un formato increíblemente común), entonces no es necesario crear un nuevo java.lang.String en absoluto. Es mucho más performante simplemente emitir el byte en Char:

completo ejemplo de trabajo:

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

Si usted es no usando extendidos caracteres como un, AE, A, C, I , Ê y pueden estar seguros de que los únicos valores transmitidos son de los primeros 128 caracteres Unicode, entonces este código también funcionará para UTF-8 y ASCII extendido (como cp-1252).

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

¿Se convierte la entidad de cadena ' query 'to utf-8 o simplemente recuerde para cuando se adjunta la entidad? – SyntaxRules

11

Mi implementación de tomcat7 acepta cadenas como ISO-8859-1; a pesar del tipo de contenido de la solicitud HTTP. La siguiente solución funcionó para mí al tratar de interpretar correctamente 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 tratar de interpretar la cadena como US-ASCII, el byte de información no fue interpretado correctamente.

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

FYI, a partir de Java 7 puede usar constantes para esos nombres de conjuntos de caracteres como ['StandardCharSets.UTF_8'] (http://docs.oracle.com/ javase/8/docs/api/java/nio/charset/StandardCharsets.html # UTF_8) y ['StandardCharSets.ISO_8859_1'] (http://docs.oracle.com/javase/8/docs/api/java/nio /charset/StandardCharsets.html#ISO_8859_1). –

4

Como alternativa, StringUtils de Apache Commons se puede utilizar.

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

o

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

Si tiene juego de caracteres no estándar, puede utilizar getBytesUnchecked() o newString() en consecuencia.

+4

Tenga en cuenta que este StringUtils de ** Commons Codec **, no Commons Lang. –

+0

Sí, es un poco complicado para los usuarios de Gradle, Maven: * "commons-codec: commons-codec : 1.10 "* (al momento de escribir). Esto también viene incluido como una dependencia con Apache POI, por ejemplo. Ap ¡arte de ese Apache Commons al rescate, como siempre! –

0
Reader reader = new BufferedReader(
    new InputStreamReader(
     new ByteArrayInputStream(
      string.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8)); 
0

No puedo comentar pero no quiero iniciar un nuevo hilo. Pero esto no está funcionando. Un simple 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 

que había necesidad b [] la misma matriz antes y después de la codificación que no lo es (esta referentes a la primera respuesta).

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

para la decodificación de una serie de bytes a un mensaje de cadena normal, finalmente lo tengo trabajando con 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")); 
} 
Cuestiones relacionadas