Detectar codificación de documento RTF en Java

Mi programa Java realiza extracción de texto en archivos RTF utilizando RTFEditorKit. Algunos de los archivos RTF contienen caracteres cirílicos (ruso) y, según la versión RTF, el texto extraído está bien o contiene galimatías. Cuando es un galimatías, puedo usar esto para obtener texto normal:

String text = ... // extracted text

String decodedText = new String(text.getBytes("ISO-8859-1"), "cp1251");

Ahora el problema es que no pude encontrar una manera de detectar automáticamente la codificación del archivo, es decir, si el texto extraído debe decodificarse o no. ¿Alguien sabe cómo hacer esto? ¡Gracias por adelantado!

EDITAR : En las primeras líneas de los archivos RTF veo algo que parece una codificación:

  • Archivos donde obtengo galimatías: {\ rtf1 \ ansi \ ansicpg1251 \ deff0 \ deflang1049
  • Archivos con texto correcto: {\ rtf1 \ ansi \ ansicpg1251 \ deff0
Respuesta 1

Los archivos RTF comienzan con dos secuencias de control, el primero de los cuales especifica la versión RTF (no la norma, pero casi siempre el cs \rtf1), y el segundo de los cuales especifica el conjunto de caracteres, que es uno de \ansi(habitual), \mac, \pc, o pca( casi nunca se encuentra). Inmediatamente después de esto, es posible especificar páginas de códigos Unicode que modifiquen la interpretación predeterminada de los caracteres, dada por \ansicpg.

No hay mucha documentación que pueda encontrar sobre esto. Intente mirar http://msdn.microsoft.com/en-us/library/aa140301(office.10).aspx , y la gente amable en la lista de correo del desarrollador de AbiWord ha pasado mucho tiempo descifrando las diversas especificaciones RTF.

Respuesta: 2

No creo que el archivo en sí tenga una codificación. Desde la página de Wikipedia :

RTF es un formato de 8 bits. Eso lo limitaría a ASCII, pero RTF puede codificar caracteres más allá de ASCII mediante secuencias de escape. Los escapes de caracteres son de dos tipos: escapes de página de códigos y escapes Unicode. En un escape de página de códigos, se utilizan dos dígitos hexadecimales después de un apóstrofe para denotar un carácter tomado de una página de códigos de Windows. Por ejemplo, si hay códigos de control que especifican Windows-1256, la secuencia \ 'c8 codificará la letra árabe beh (ب).

Si se requiere un escape Unicode, se usa la palabra de control \ u, seguida de un entero decimal con signo de 16 bits que proporciona el número de punto de código Unicode.

así que sospecho que tendrá que extraer el texto usted mismo y luego analizarlo más usando las reglas anteriores.

Respuesta: 3

No creo que Java tenga nada dentro de las bibliotecas estándar para hacer esto.

Echa un vistazo al componente de la UCI . Tiene una variante de Java y puede usar CharsetDetector para obtener la codificación del documento.

Respuesta: 4

Estoy revisando las diferencias entre Struts1 y Strust2, descubrí que, un problema común en Struts 1 es programar en clases abstractas en lugar de interfaces. ¿Alguien podría dejarme ...

Tengo una lista de objetos que contiene diferentes tipos de objetos, pero una sola propiedad es común entre todos. La lista contiene objetos de clase de campo, clase de botón, clase de página, etc. pero una propiedad es ...

Actualización: Respondí mi propia pregunta aquí: Escanear classpath / modulepath en tiempo de ejecución en Java 9 - [Pregunta anterior - obsoleta:] En el sistema de módulos Java 9, puede encontrar módulos del sistema usando Set <...

Las "lecturas sucias", que significan leer el valor de un objeto a pesar de que está bloqueado por otro hilo, se describen en el sitio web de Terracotta, sin embargo, he oído que no deberían usarse, incluso si usted no ...