significa - Cómo analizar una cadena que está en una codificación diferente de Java
que significa != en java (3)
La conversión se hace generalmente por algo como esto:
String properlyEncoded =
new String(original.getBytes(originalEncoding), newEncoding);
Tenga en cuenta que no es poco probable que se pierda cierta información durante la conversión.
Tengo una cadena que he leído desde un documento de Word. Creo que está en la codificación "Cp1252". Java usa UTF8.
¿Cómo busco esa cadena para esos caracteres especiales en Cp1252 y los reemplazo con un carácter UTF8 apropiado?
específicamente, quiero reemplazar el carácter "En Dash" con un simple "-"
El siguiente bloque de código toma el projDateString que proviene del documento de Word y trata de hacer tal cosa
char[] test = projDateString.getBytes("Cp1252");
for(int i = 0; i < test.length; i++){
System.out.println "test["+ i + "] = " + Integer.toHexString((byte)test[i]);
}
String projDateString2 = new String(test);
projDateString2.replaceAll("/0x96", "/u2013");
System.out.println("projDateString2: " + projDateString)
No estoy seguro de configurar correctamente projDateString2. Como puede ver, el valor hexadecimal de ese guión es ffffff96 cuando obtengo Bittes en la cadena usando la codificación Cp1252. Si obtengo Bittes con UTF8, aparece como 3 valores hexadecimales en lugar de uno.
Esto me da el siguiente resultado:
test[0] = 30
test[1] = 38
test[2] = 2f
test[3] = 32
test[4] = 30
test[5] = 31
test[6] = 30
test[7] = 20
test[8] = ffffff96
test[9] = 20
test[10] = 50
test[11] = 72
test[12] = 65
test[13] = 73
test[14] = 65
test[15] = 6e
test[16] = 74
projDateString2: 08/2010 ΓÇô Present
Como puede ver, el reemplazo no hizo nada, y la impresión todavía me da caracteres de basura en lugar de un texto sin formato "-"
Las cadenas de Java están siempre en UTF-16, al menos en lo que se refiere a la API ... pero generalmente solo puedes pensar en ellas como "Unicode". El hecho de que sean UTF-16 solo es realmente relevante cuando se trata de caracteres fuera del plano multilingüe básico, es decir, con valores Unicode por encima de U + FFFF. Deben representarse como pares de sustitución en Java. Pero no creo que deba preocuparse por esto en su caso. Así que solo piense en los valores en Strings como "texto Unicode" sin una codificación específica ... en particular, definitivamente no en UTF-8 o CP1252. Esas son las codificaciones utilizadas para convertir datos binarios (por ejemplo, una matriz de bytes) en datos de texto (por ejemplo, una cadena).
No debe usar String.getBytes()
o new String(byte[])
sin especificar la codificación: ese es el problema. Esos siempre usan la codificación predeterminada de la plataforma, que casi siempre es la opción incorrecta.
Usted dice que "tiene una cadena que he leído de un documento de Word", ¿cómo lo leyó? ¿Cómo comenzó la vida?
Si tiene los bytes y conoce la codificación relevante, debe usar:
String text = new String(bytes, encoding);
Nunca deberías tener que lidiar con una cadena que se haya creado con una codificación incorrecta: si llegas a esa etapa, casi te arriesgas a perder información. Aborde el problema lo antes posible, en lugar de tratar de arreglar los datos más adelante.
Lo siguiente que debemos entender es que la clase String
en Java es inmutable. Llamar a replaceAll
en una cadena no cambiará la cadena existente . En su lugar, devolverá una nueva cadena con los reemplazos realizados.
Entonces esta declaración:
projDateString2.replaceAll("/0x96", "/u2013");
nunca hará lo que quieras. Incluso si todo lo demás es correcto, debes usar:
projDateString2 = projDateString2.replaceAll("/0x96", "/u2013");
(o algo similar). No creo que en realidad haga lo que quiera de todos modos, pero debe ser consciente de ello cuando todo lo demás esté resuelto.
Primero, debe asegurarse de convertir correctamente los bytes de CP1252 a la representación de caracteres de Java (que es UTF-16). Como está utilizando una biblioteca para analizar archivos .docx , probablemente esto haya sucedido.
Ahora todo lo que necesita hacer es llamar a projDateString.replace(''/u2013'', ''-'')
y hacer algo con el valor de retorno. No hay necesidad de replaceAll()
, ya que no está trabajando con expresiones regulares.