2012-03-14 15 views
5

Me gustaría poder convertir una cadena UTF-8 sin formato a una cadena Hex. En el siguiente ejemplo, he creado una cadena de muestra UTF-8 que contiene 2 letras. Luego trato de obtener los valores Hex pero me da valores negativos.JAVA: obtenga valores hexadecimales UTF-8 de una cadena?

¿Cómo puedo hacer que me dan 05D0 y 05D1

String a = "\u05D0\u05D1"; 
byte[] xxx = a.getBytes("UTF-8"); 

for (byte x : xxx) { 
    System.out.println(Integer.toHexString(x)); 
} 

Gracias.

Respuesta

5

No convierta a una codificación como UTF-8 si desea el punto de código. Use Character.codePointAt.

Por ejemplo:

Character.codePointAt("\u05D0\u05D1", 0) // returns 1488, or 0x5d0 
+1

Bueno, ¿quieres los valores hexadecimales del UTF-8 (0xD790) o el punto de código (0x000005D0)? Si quiere el punto de código, convierta los bytes a una cadena con 'new String (bytes," UTF-8 ")' y luego use 'Character.codePointAt (...). ToHexString()' para obtener la representación hexadecimal. – ataylor

+0

Tal vez me esté perdiendo algo. 'Character.codePointAt' no tiene un método' toHexString', devuelve un número entero. ¿Puedes darme un ejemplo completo? Gracias – thedp

+1

Vaya, toHexString es un método estático. 'System.out.println (Integer.toHexString (Character.codePointAt (" \ u05D0 ", 0)))' imprimirá '5d0'. Si desea rellenarlo con ceros a la izquierda, intente con 'System.out.printf ("% 08x ", Character.codePointAt (" \ u05D0 ", 0))' que imprime '000005d0'. – ataylor

3

Los valores negativos se deben a que el rango de byte es de -128 a 127. El siguiente código producirá valores positivos:

String a = "\u05D0\u05D1"; 
byte[] xxx = a.getBytes("UTF-8"); 

for (byte x : xxx) { 
    System.out.println(Integer.toHexString(x & 0xFF)); 
} 

La diferencia principal es que da salida a x & 0xFF en lugar de sólo x, convierte esta operación byte a int, soltando el letrero.

+0

Gracias por la rápida respuesta, pero todavía no da los valores correctos. Estoy tratando de reproducir los valores Hex de 05D0, el código me da d7 90 – thedp

+0

@thedp Esto ocurre porque los símbolos que codifica están representados en UTF-8 por estos bytes. Si desea recibir los bytes que dijo, debe usar UTF-16. – Malcolm

+1

La codificación UTF-8 no hace lo que crees que sospecho. Cada valor está codificado en múltiples bytes. Ver http://en.wikipedia.org/wiki/UTF-8#Description para más detalles. – sw1nn

Cuestiones relacionadas