Java modificó las cadenas UTF-8 en Python

Estoy interactuando con una aplicación Java a través de Python. Necesito poder construir secuencias de bytes que contengan cadenas utf-8. Java usa una encoding utf-8 modificada en DataInputStream.readUTF () que no es compatible con Python ( al menos )

¿Alguien puede dirigirme en la dirección correcta para construir cadenas utf-8 modificadas con java en python?

Actualización # 1: para ver un poco más sobre el java modificado utf-8, consulte el método readUTF desde la interfaz DataInput en la línea 550 aquí , o aquí en la documentación de Java SE .

Actualización # 2: estoy tratando de interactuar con una aplicación web JBoss de terceros que utiliza este formato utf8 modificado para leer cadenas a través de solicitudes POST llamando a DataInputStream.readUTF (perdón por cualquier confusión con respecto a la operación normal de la cadena java utf8).

Gracias por adelantado.

Puede ignorar la encoding UTF-8 modificada (MUTF-8) y simplemente tratarla como UTF-8. En el lado de Python, puedes manejarlo así,

  1. Convierte la cadena a UTF-8 normal y almacena bytes en un búfer.
  2. Escriba la longitud del búfer de 2 bytes (no la longitud de la cadena) como binario en big-endian.
  3. Escribe todo el búfer.

He hecho esto en PHP y Java no se quejó de mi encoding (al menos en Java 5).

MUTF-8 se utiliza principalmente para JNI y otros sistemas con cadenas terminadas en nulo. La única diferencia con respecto al UTF-8 normal es cómo se codifica U + 0000. La encoding UTF-8 normal utiliza 1 byte (0x00) y MUTF-8 utiliza 2 bytes (0xC0 0x80). En primer lugar, no debe tener U + 0000 (un punto de código no válido) en ningún texto Unicode. En segundo lugar, DataInputStream.readUTF() no impone la encoding, por lo que acepta cualquiera de los dos.

EDITAR: El código de Python debería tener este aspecto,

 def writeUTF(data, str): utf8 = str.encode('utf-8') length = len(utf8) data.append(struct.pack('!H', length)) format = '!' + str(length) + 's' data.append(struct.pack(format, utf8)) 

De acuerdo, si necesita leer el formato de DataInput.readUTF , sospecho que solo tendrá que convertir el formato (bien documentado) a Python.

No parece que sea particularmente difícil de hacer. Después de leer la longitud y luego los propios datos binarios, le sugiero que use una primera pasada para calcular cuántos caracteres Unicode habrá en la salida, luego construya una cadena en consecuencia en una segunda pasada. Sin conocer Python, no sé los entresijos de cómo construir una cadena de manera eficiente, pero dada la especificación vinculada no puedo imaginar que sea muy difícil. Es posible que desee consultar la fuente del decodificador UTF-8 existente como punto de partida.

Sé que esta pregunta es muy antigua, pero todavía quiero contribuir, ya que resolví el mismo problema y lo resolví.

Encontré la implementación de este utf8 modificado en las fonts de openjdk y lo traduje a python. Aquí hay un enlace a la esencia que he creado.

Tal vez esto pueda ayudarte, aunque parece que es lo contrario de lo que estás haciendo:

Conectando un applet de Java a un servidor de socket python