Tengo el siguiente valor en una variable de cadena en Java que tiene caracteres UTF-8 codificados como a continuación
Dodd\u2013Frank
en lugar de
Dodd–Frank
(Supongamos que no tengo control sobre cómo se asigna este valor a esta variable de cadena)
¿Ahora cómo lo convierto (codifica) correctamente y lo vuelvo a almacenar en una variable String
?
Encontré el siguiente código
Charset.forName("UTF-8").encode(str);
Pero esto devuelve un ByteBuffer
, pero quiero un String
vuelta.
Editar :
Algo más de información adicional.
Cuando uso System.out.println(str);
yo obtengo
Dodd\u2013Frank
No estoy seguro de cuál es la terminología correcta (UTF-8 o Unicode). Perdón por eso.
tratar
str = org.apache.commons.lang3.StringEscapeUtils.unescapeJava(str);
de Apache Commons Lang
Puede aprovechar el hecho de que java.util.Properties admite cadenas con secuencias de escape ‘\ uXXXX’ y hacer algo como esto:
Properties p = new Properties(); p.load(new StringReader("key="+yourInputString)); System.out.println("Escaped value: " + p.getProperty("key"));
Inelegante, pero funcional.
Puede convertir ese búfer de bytes a String de esta manera:
import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.ByteBuffer public static CharsetDecoder decoder = CharsetDecoder.newDecoder(); public static String byteBufferToString(ByteBuffer buffer) { String data = ""; try { // EDITOR'S NOTE -- There is no 'position' method for ByteBuffer. // As such, this is pseudocode. int old_position = buffer.position(); data = decoder.decode(buffer).toString(); // reset buffer's position to its original so it is not altered: buffer.position(old_position); } catch (Exception e) { e.printStackTrace(); return ""; } return data; }
Supongamos que tiene un valor Unicode, como 00B0 (símbolo de grado, o superíndice ‘o’, como en la abreviación en español de ‘primero’)
Aquí hay una función que hace exactamente lo que quiere:
public static String unicodeToString( char charValue ) { Character ch = new Character( charValue ); return ch.toString(); }
Utilicé StringEscapeUtils.unescapeXml
para unescape de la cadena cargada desde una API que da resultado XML.